我的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似乎都不是一个优雅的解决方案。
答案 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,但我不建议这样做。
编辑:发布回复之前,我必须承认不阅读您的链接。但是,我仍然认为这是最优雅的解决方案。