.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要求我们将IJobFactoryISchedulerFactory注入为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要求我们将IJobFactoryISchedulerFactory注入为Scoped类型呢?

所以我的解决办法为:把MyJob注册为 Scoped

//添加我们的Job
services.AddScoped<MyJob>();

这样定时任务也同样执行,没有任何异常,不知道会有什么后果,往大佬指正

 

posted @ 2021-04-06 11:49  吃辣椒的小毛驴  阅读(1112)  评论(0编辑  收藏  举报