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

时间:2018-08-25 19:58:20

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

我的aspnet核心应用需要在指定的时间间隔内对数据进行爬网。我选择实现IHostedService使其与api并行运行。此托管服务需要注入一些服务。现在我在启动时注册了它们,但是出现了这个错误:

  

System.InvalidOperationException:'无法使用单例'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'中的作用域服务'IXService'。'

我的startup.cs:

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

我在DbContext上也遇到了类似的问题,我用https://stackoverflow.com/a/48368934/8475133解决了这个问题,但是这次我需要通过更深的层进行依赖注入,并且在每个服务层中处理IServiceScopeFactory似乎都不是一个优雅的解决方案。

1 个答案:

答案 0 :(得分:2)

不允许您执行此操作的原因是因为MyHostedService具有单例生存期,该生存期比作用域更长。这里的基本假设是,不应无限期地使注册为作用域的服务保持活动状态,如果单例服务保留对作用域服务的引用,则很容易发生这种情况。

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

也就是说,替换

    {
      "value": 1000.00000000,
      "valueSat": 100000000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 217e65d7d68fc632e1ae63b7536c900021fa9272 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914217e65d7d68fc632e1ae63b7536c900021fa927288ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "yPNYZoqKHMM49z1JzvCFAzrSTJpKmVmMio"
        ]
      }
    }

使用

_xService.Foo();

当然,另一种选择是将XService简单注册为单例,只需将对AddScoped的调用替换为AddSingleton,但我不建议这样做。

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