.net 核心依赖注入到托管服务

.net core dependency injection to hosted service

我的 .net 核心应用需要在指定的时间间隔内抓取数据。我选择与 API 并行实施 IHostedService 到 运行。托管服务需要注入一些服务。我在 startup.cs 中注册它们,但出现错误:

System.InvalidOperationException: 'Cannot consume scoped service 'IXService' from singleton 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'.'

我的startup.cs:

services.AddScoped<IXService, XService>();
services.AddHostedService<MyHostedService>();

我对 DbContext 也有类似的问题,我用 解决了它,但是这次我需要依赖注入穿过更深的层并在每个层中处理 IServiceScopeFactory 似乎不是一个优雅的解决方案.

不允许您这样做的原因是因为 MyHostedService 有一个单例生命周期,比作用域的生命周期长。这里的基本假设是注册为作用域的服务不应该无限期地保持活动状态,如果单例服务保持对作用域服务的引用,这很容易发生。

我认为您正在寻找的解决方案是将 IServiceProvider 注入 MyHostedService,在您需要时使用它来创建新的范围和新的 XService 实例。

即替换

_xService.Foo();

using(var scope = _serviceProvider.CreateScope()) {
    var xService = scope.ServiceProvider.GetService<IXService>();
    xService.Foo();
}

当然,另一种方法是将 XService 简单地注册为单例,只需将对 AddScoped 的调用替换为 AddSingleton,但我不推荐这样做。

编辑:我必须承认在发布我的回复之前没有阅读您的 link。不过,我仍然认为这是最优雅的解决方案。