作者:ik82jht | 来源:互联网 | 2022-12-06 16:58
我的aspnet核心应用需要在指定的时间间隔内抓取数据。我选择实现IHostedService使其与api并行运行。此托管服务需要注入一些服务。现在我在启动时注册它们,但出现此错误:
System.InvalidOperationException:'无法从单例'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'中使用作用域服务'IXService'。
我的startup.cs:
services.AddScoped();
services.AddHostedService();
我在DbContext中遇到了类似的问题,我通过/sf/ask/17360801/解决了这个问题,但是这次我需要通过更深层次的依赖注入并在每个服务中处理IServiceScopeFactory优雅的解决方案。
1> 小智..:
不允许执行此操作的原因是因为MyHostedService具有单例生存期,该生存期比作用域更长。这里的基本假设是,注册为作用域的服务不应无限期保持活动状态,如果单例服务保留对作用域服务的引用,则很容易发生这种情况。
我认为您正在寻找的解决方案是将IServiceProvider注入MyHostedService中,并在需要时使用它创建新的作用域和新的XService实例。
也就是说,更换
_xService.Foo();
与
using(var scope = _serviceProvider.CreateScope()) {
var xService = scope.ServiceProvider.GetService();
xService.Foo();
}
当然,另一种选择是简单地将XService注册为单例,只需将对AddScoped的调用替换为AddSingleton,但我不建议这样做。
编辑:我必须承认在发布我的回复之前不阅读您的链接。但是,我仍然认为这是最优雅的解决方案。
这并不完全正确。AddHostedService
将它们添加为瞬态,但是它们只能由HostedServiceExecutor https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.hosting.internal.hostedserviceexecutor?view=aspnetcore-创建一次2.1。