c# - 如何在不使用 ScopeFactory 的情况下将服务注入 HostedService?
问题描述
我为这个问题找到的大多数解决方案都涉及使用IServiceScopeFactory
将作用域服务注入托管服务。我不想这样做,因为它使测试变得困难。使用 将我需要的服务注入到我的托管服务中会很好IServicesCollection
,就像Startup.cs
. 理想情况下是这样的:
# Program.cs
...
.ConfigureServices((hostContext, services) =>
{
services.AddDbContext<MyContext>();
services.AddSingleton<IOtherInjectedService, OtherInjectedService>();
services.AddScoped<MyService>(); // <-- how does this work?
services.AddHostedService<MyHostedService>();
});
# MyHostedService.cs
public class MyHostedService : IHostedService, IDisposable
{
private readonly MyService _svc;
public MyHostedService(MyService svc)
{
_svc = svc;
}
public void DoWork() {
_svc.Work();
}
}
# MyService.cs
public class MyService
{
private readonly MyContext _context;
private readonly IOtherInjectedService _otherService;
public void Work()
{
_otherService.Foo(_context);
}
}
当我尝试在Program.cs
. 我看到的是这个错误:
Cannot consume scoped service 'MyService' from singleton 'Microsoft.Extensions.Hosting.IHostedService'.
这是有道理的——单例不能使用范围服务。但看起来没有办法制作IHostedService
范围。这是否意味着不使用作用域工厂就无法注入依赖项?我希望不是!至少可以说,这使测试变得困难。
在不使用? 的情况下将服务注入托管服务的正确方法是IServiceScopeFactory
什么?
解决方案
推荐阅读
- sqlite - 两列的不同组合与第三列的排序?
- flutter - 颤动图像放大并拖动
- flutter - Flutter Grid View Builder 图像网络
- database-partitioning - 如何读取 COMPO 分区表的指定分区?
- c# - 使用 DotNetCore 在 linux 上运行 Windows 应用程序
- ios - 在 iOS 中开发类似 IGTV 的功能
- postgresql - 增加 postgresql 中的最大连接数
- python - Python 构建错误“错误:无法为使用 PEP 517 且无法直接安装的 numpy 构建轮子”
- node.js - 适用于所有用户的 BIM 360 查看器,无需自定义集成
- qgis - 更新 python 未定义对 Py_PreInitialize 的引用后