.netCore 使用Quartz做定时任务,生命周期注册为Scoped
上篇使用Quartz.NET在ConfigureServices中进行注册时
产生报错信息如下:
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: ***.TimedTask.MyJob Lifetime: Singleton ImplementationType: ***.TimedTask.MyJob': Cannot consume scoped service '***' from singleton '***.TimedTask.MyJob'.)
搜索了一下,发现个这个老哥报错信息一样:
博文:将生命周期注册为Scoped的依赖项,注入到生命周期注册为Singleton的类中
最近在项目中,结合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
}
}
但是为什么不把
Quartz.NET要求我们将IJobFactory
和ISchedulerFactory
注入为Scoped
类型呢?
所以我的解决办法为:把MyJob注册为 Scoped
//添加我们的Job services.AddScoped<MyJob>();
这样定时任务也同样执行,没有任何异常,不知道会有什么后果,往大佬指正