- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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/
我在全新的 .net core 2 网络应用程序中发生了一件奇怪的事情。这是来自 Visual Studio 内置模板的标准 Web API。 VS 2017,所有的爵士乐。这是整个 startup.
当我尝试注册更多时 AddHostedService 方法启动异步 仅在第一个调用 services.AddHostedService(); // StartAsync is called servi
在 ASP.NET Core 2.1 中注册自定义托管服务的正确方法是什么?例如,我有一个派生自 BackgroundService 的自定义托管服务名为 MyHostedService。我该如何注册
迁移到 ASP Core3 后,此行卡住了 Web 应用程序启动过程(使用 VS 调试:浏览器已弹出但页面加载从未结束) serviceCollection.AddHostedService(); 它
我是一名优秀的程序员,十分优秀!