gpt4 book ai didi

c# - .NET Core Scoped 通过 DI 在 Singleton 中调用

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:44 25 4
gpt4 key购买 nike

我在 2.0 中遇到错误,我以前在 .Net Core 1.1 中没有遇到过。

无法使用单例“ArithmosDaily.IHangfireJobSchedulerService”中的作用域服务“ArithmosDaily.Data.ArithmosContext”。

我正在使用 Hangfire,我需要它来访问我的数据库(因此我通过 DI 注入(inject)我的上下文)以按计划使用来自 API 的一些数据更新数据库。所以看起来 DbContext 被实例化为 Scoped,我将我的 Hangfire 服务设置为 Singleton。在 Core 1.1 中,没有检查嵌套在 Singleton 中的 Scoped。我知道这个概念是有效的,因为我将它从我的另一个 Core 1.1 项目中剥离出来,并将 Context 嵌套在我的 Singleton 服务中工作正常。 (令我恼火的是,微软觉得有必要控制我,只是因为我可能做坏事)。

因此,我将我的 Hangfire 服务从 Singleton 更改为 Scoped,希望因为我的 DbContext 显然是 Scoped,所以 Scoped inside Scoped 会很好,但我得到了这个错误:无法解析范围服务'ArithmosDaily.IHangfireJobSchedulerService' 来自根提供者。我仍然不知道那是什么意思。

经过一些挖掘,我发现了帖子底部的两个链接(到目前为止,我只能找到这些链接)。我尝试按照第一个链接中的建议在我的 Startup 中设置 services.BuildServiceProvider(false); ,但这并没有改变我的 Configure 中的任何内容:我在设置服务时仍然遇到错误。

我完全被难住了,不知道还能尝试什么。也许我的代码放错地方了?我不确定。

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

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

最佳答案

In Core 1.1, there was no check for Scoped nested inside a Singleton.

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

the Context inside my Singleton service works fine.

这样的事情是相当异常(exception)的,这就是为什么默认阻止它是一件好事。例如,DbContext 不是线程安全的,在应用程序的持续时间内保持事件状态几乎在所有情况下都会导致并发错误,这些错误只会在生产中运行时出现,当多个请求同时进入时。

如果这不会导致您的情况出现错误,那是异常(exception)情况,而不是规则。

Cannot resolve scoped service 'ArithmosDaily.IHangfireJobSchedulerService' from root provider. I still have no clue what that one even means.

那个错误确实很困惑。这意味着,对于 .NET Core 容器,您应该始终从 IServiceScope.ServiceProvider(或注入(inject)的 IServiceProvider)解析,但绝不能从根IServiceProvider。在 ASP.NET Core 请求中运行时,框架将代表您自动调用ServiceProviderServiceExtensions.CreateScope`,并使用该作用域为您解析 Controller 和其他服务。在 Web 请求之外运行时,您可能需要自己创建一个范围。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com