将生命周期注册为Scoped的依赖项,注入到生命周期注册为Singleton的类中
程序员文章站
2024-02-20 08:13:58
...
最近在项目中,结合Quartz.NET和IHostedService
实现了.NET Core控制台的计划任务。在这个项目中,需要注入DbContext
来进行数据库连接与操作。IServiceCollection
的扩展方法AddDbContext
是将DbContext
注入为Scoped
类型的生命周期的,而Quartz.NET要求我们将IJobFactory
和ISchedulerFactory
注入为Singleton
类型的。当我们在Singleton
类型的类中直接注入Scoped
类型的依赖项时,会抛出错误"不能在Singleton中使用Scoped类型的服务":
Cannot consume scoped service 'XXX' from singleton 'XXX'.
解决方案
在需要使用Scoped
类型依赖项的类中,不直接注入此依赖项,而是注入IServiceScopeFactory
依赖项:
public class MySingletonService : IMySingletonService
{
private readonly IServiceScopeFactory _scopeFactory;
public MySingletonService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
}
在需要使用Scoped
类型依赖项的方法中,通过IServiceScopeFactory的实例解析此依赖项即可:
public class MySingletonService : IMySingletonService
{
// Other code
public void Scoped()
{
using var scope = _scopeFactory.CreateScope();
var ctx = scope.ServiceProvider.GetRequiredService<MyDbContext>();
// Other code
}
}
参考
上一篇: .net core 模拟发布订阅
下一篇: 字典缓存表达式树