zoukankan      html  css  js  c++  java
  • .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>();

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

  • 相关阅读:
    PHP 处理历史数据的伪代码
    PHP 算法之 -- 计算器设计
    PHP
    PHP-设计模式之-中介者模式
    删除更新数据库字段
    MySQL update 链表 (一个表数据当做条件错误时候的转换)
    题解 CF506C Mr. Kitayuta vs. Bamboos
    题解 LOJ2049 「HNOI2016」网络
    题解 CF1349C Orac and Game of Life
    题解 CF1349B Orac and Medians
  • 原文地址:https://www.cnblogs.com/xinbaba/p/14620938.html
Copyright © 2011-2022 走看看