我在2.0版中遇到了一个错误,而我以前从未在.Net Core 1.1版中获得该错误。

Cannot consume scoped service 'ArithmosDaily.Data.ArithmosContext' from singleton 'ArithmosDaily.IHangfireJobSchedulerService'.

我正在使用Hangfire,因此我需要它来访问数据库(因此我通过DI注入了上下文)以按计划使用API​​中的一些数据更新数据库。因此,看来DbContext被实例化为Scoped,并且我将我的Hangfire服务设置为Singleton。在Core 1.1中,不检查嵌套在Singleton中的Scoped。我知道这个概念有效,因为我将其从Core 1.1项目的另一个项目中剔除了,并将Context嵌套在我的Singleton服务中可以正常工作。 (这让我很烦恼,因为仅仅因为我可能做错了事,Microsoft觉得有必要控制我)。

因此,我将Hangfire服务从Singleton更改为Scoped,希望由于我的DbContext显然是Scoped,所以Scoped内部的Scoped会很好,而是出现此错误:Cannot resolve scoped service 'ArithmosDaily.IHangfireJobSchedulerService' from root provider.我仍然不知道那甚至意味着什么。

经过一些挖掘之后,我发现了帖子底部的两个链接(到目前为止,我所能找到的全部)。我尝试按照第一个链接中的建议在“启动”中设置services.BuildServiceProvider(false);,但是这并没有更改“配置”中的任何内容:设置服务时仍然出现错误。

我完全感到困惑,不知道还能尝试什么。也许我在错误的位置输入了代码?我不确定。

这是我的启动和配置代码:

public void ConfigureServices(IServiceCollection services)
{
    services.BuildServiceProvider(false);

    string conn = Configuration.GetConnectionString("Arithmos");
    services.AddDbContext<ArithmosContext>(options => options.UseSqlite(conn));

    services.AddMvc();

    services.AddHangfire(x => x.UseSQLiteStorage(conn));
    services.AddScoped<IHangfireJobSchedulerService, HangfireJobSchedulerService>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
{
    lifetime.ApplicationStarted.Register(OnStartup);
    lifetime.ApplicationStopping.Register(OnShutdown);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
        app.UseExceptionHandler("/Error");

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });

    app.UseHangfireServer();
    app.UseHangfireDashboard(options: new DashboardOptions
    {
        Authorization = new[] { new HangfireAuthorizationFilter() }
    });
    jobSchedulerService = app.ApplicationServices.GetRequiredService<IHangfireJobSchedulerService>();
}


我遇到了以下问题,但它们并没有帮助我太多:

ASP.Net Core 2 ServiceProviderOptions.ValidateScopes Property

Cannot resolve scoped service Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope from root provider

最佳答案

在Core 1.1中,不检查嵌套在Singleton中的Scoped。


确实有。但是默认情况下未启用它。这是IMO在.NET Core 1中的错误。


  我的Singleton服务中的上下文工作正常。


这种事情行之有效是非常例外的,这就是为什么默认情况下阻止它是一件好事。例如,DbContext不是线程安全的,并且在应用程序运行期间将其保持活动状态几乎在所有情况下都将导致并发错误,这些错误仅在生产中运行且同时有多个请求出现时才会出现。

这不会在您的情况下导致错误,这是例外,而不是规则。


  无法从根提供者解析作用域服务'ArithmosDaily.IHangfireJobSchedulerService'。我仍然不知道那甚至意味着什么。


该错误确实非常令人困惑。这意味着,对于.NET Core容器,您应该始终从IServiceScope解析,而不是从IServiceProvider解析。在ASP.NET Core请求中运行时,框架将代表您自动调用ServiceProviderServiceExtensions.CreateScope,并使用该作用域为您解析控制器和其他服务。在Web请求之外运行时,您可能需要自己创建一个范围。

关于c# - .NET Core Scoped通过DI在Singleton中调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50362622/

10-11 23:22