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>();

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

  • 相关阅读:
    页面滚动
    代码提交报错
    校区下部门 及校区下员工
    表查询
    Jemeter命令执行
    抓包工具
    彻底解决mac下terminal路径显示问题
    PHP 性能分析第二篇: Xhgui In-Depth
    PHP 性能分析第一篇: Intro to Xhprof & Xhgui
    phpredis pipeline
  • 原文地址:https://www.cnblogs.com/xinbaba/p/14620938.html
Copyright © 2011-2022 走看看