c# - .net 核心依赖注入(inject)到托管服务

标签 c# asp.net-core dependency-injection asp.net-core-hosted-services

<分区>

我的 .net 核心应用程序需要在指定的时间间隔内抓取数据。我选择实现 IHostedService 以与 API 并行运行它。托管服务需要注入(inject)一些服务。我在 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 时遇到了类似的问题,我用 https://stackoverflow.com/a/48368934/8475133 解决了它, 但这次我需要依赖注入(inject)穿过更深的层并在每个层中处理 IServiceScopeFactory 似乎不是一个优雅的解决方案。

最佳答案

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

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

即替换

_xService.Foo();

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

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

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

关于c# - .net 核心依赖注入(inject)到托管服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020799/

相关文章:

c# - php中的友元函数是什么?

c# - 如何从 "ErrorMessage"翻译 "Custom Attribute"

c# - 当用户未使用 ASP.NET Core 2.2 和 OIDC 获得授权时自动重定向到外部权限

angularjs - 如何使用带有 Angular 依赖注入(inject)的 typescript 继承

javascript - AngularJS 模块声明顺序

dependency-injection - 没有 ASP.NET Core 的 .NET Core 中的 DI

c# - 如何从 SSIS 中的脚本任务重置对象变量?

c# - 是否可以通过单击其子控件之一来移动复合控件?

c# - 使用 TimeStamp_Sys100NS 的负 CPU 使用率

entity-framework - Entity Framework Core DbSet 未从数据库返回任何数据