gpt4 book ai didi

c# - 在 ASP.NET Core 中注册 HostedService 的正确方法。 AddHostedService 与 AddSingleton

转载 作者:IT王子 更新时间:2023-10-29 04:49:07 25 4
gpt4 key购买 nike

在 ASP.NET Core 2.1 中注册自定义托管服务的正确方法是什么?例如,我有一个派生自 BackgroundService 的自定义托管服务名为 MyHostedService。我该如何注册?

public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
services.AddSingleton<IHostedService, MyHostedService>();
}

public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
services.AddHostedService<MyHostedService>();
}

?

Here我们可以看到第一种情况,但是here还有第二种情况。

这些方法是否相等?

最佳答案

更新

在过去,HostedService 是一个长期存在的 transient ,有效地作为一个单例。自 .NET Core 3.1 it's an actual Singleton .


使用AddHostedService

托管服务不仅仅是单例服务。运行时“知道”它,可以告诉它通过调用 StartAsync 开始或通过调用 StopAsync() 停止,例如每当应用程序池被回收时。运行时可以在 Web 应用程序本身终止之前等待托管服务完成。

作为the documentation explains作用域服务可以通过在托管服务的工作方法中创建作用域来使用。这同样适用于 transient 服务。

为此,必须将 IServicesProvider 或 IServiceScopeFactory 注入(inject)到托管服务的构造函数中并用于创建范围。

借用文档,服务的构造函数和工作方法可以如下所示:

public IServiceProvider Services { get; }

public ConsumeScopedServiceHostedService(IServiceProvider services,
ILogger<ConsumeScopedServiceHostedService> logger)
{
Services = services;
_logger = logger;
}


private void DoWork()
{
using (var scope = Services.CreateScope())
{
var scopedProcessingService =
scope.ServiceProvider
.GetRequiredService<IScopedProcessingService>();

scopedProcessingService.DoWork();
}
}

This related question显示如何在托管服务中使用 transient DbContext:

public class MyHostedService : IHostedService
{
private readonly IServiceScopeFactory scopeFactory;

public MyHostedService(IServiceScopeFactory scopeFactory)
{
this.scopeFactory = scopeFactory;
}

public void DoWork()
{
using (var scope = scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();

}
}

}

关于c# - 在 ASP.NET Core 中注册 HostedService 的正确方法。 AddHostedService 与 AddSingleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480324/

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