gpt4 book ai didi

c# - 在 Asp.Net Core 应用程序的单例中使用 Scoped 服务

转载 作者:行者123 更新时间:2023-12-03 20:28:29 25 4
gpt4 key购买 nike

在我的 Asp.Net Core 应用程序中,我需要一个可以在应用程序的生命周期内重复使用的单例服务。要构建它,我需要一个 DbContext (来自 EF Core),但它是一个范围服务而不是线程安全的。

因此,我使用以下模式来构建我的单例服务。它看起来有点 hacky,因此我想知道这是否是可以接受的方法并且不会导致任何问题?

services.AddScoped<IPersistedConfigurationDbContext, PersistedConfigurationDbContext>();
services.AddSingleton<IPersistedConfigurationService>(s =>
{
ConfigModel currentConfig;
using (var scope = s.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<IPersistedConfigurationDbContext>();
currentConfig = dbContext.retrieveConfig();
}
return new PersistedConfigurationService(currentConfig);
});

...

public class ConfigModel
{
string configParam { get; set; }
}

最佳答案

虽然 Dependency injection: Service lifetimes ASP.NET Core 中的文档说:

It's dangerous to resolve a scoped service from a singleton. It may cause the service to have incorrect state when processing subsequent requests.



但在你的情况下,这不是问题。实际上,您并没有从单例中解析范围服务。它只是在需要时从单例获取范围服务的实例。 所以你的代码应该可以正常工作,没有任何已处理的上下文错误!

但另一个潜在的解决方案可以使用 IHostedService .这是有关它的详细信息:

Consuming a scoped service in a background task (IHostedService)

关于c# - 在 Asp.Net Core 应用程序的单例中使用 Scoped 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708488/

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