最近在项目中,结合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 : IMySinglet