当前位置: 首页 > article >正文

Quartz.Net_依赖注入

简述

有时会遇到需要在IJob实现类中依赖注入其他类或接口的情况,但Quartz的默认JobFactory并不能识别具有有参构造函数的IJob实现类,也就无法进行依赖注入

需要被依赖注入的类:

public class TestClass
{
    public TestClass(Type jobType, string cronExpression)
    {
        JobType = jobType;
        CronExpression = cronExpression;
    }

    public Type JobType { get; }
    public string CronExpression { get; }
}

解决方式

1.安装依赖:Quartz、Microsoft.Extensions.DependencyInjection

2.实现接口

        实现IJob接口

    public class MyJob : IJob
    {
        private readonly TestClass test;
        public MyJob(TestClass test)
        {
            this.test = test;
        }

        public Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine("hello");
            Console.WriteLine(test.ToString());
            return Task.CompletedTask;
        }
    }

        实现IJobFactory接口

public class MyJobFactory : IJobFactory
{
    private readonly IServiceProvider _serviceProvider;
    public MyJobFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
    }

    public void ReturnJob(IJob job) { }
}

3.将IJob实现类、IJobFactory实现类、需要被依赖注入的类(TestClass)添加进容器

private static ServiceProvider ConfigureServices()
{
    var services = new ServiceCollection();

    services.AddSingleton<MyJob>();

    services.AddSingleton<IJobFactory, MyJobFactory>();

    services.AddSingleton(new TestClass(
        jobType: typeof(MyJob),
        cronExpression: "0/5 * * * * ?"));

    return services.BuildServiceProvider();
}

4.将scheduler的JobFactory属性替换为IJobFactory实现类的实例

var scheduler = await StdSchedulerFactory.GetDefaultScheduler();

// JobFactory替换为IJobFactory实现类的实例
scheduler.JobFactory = serviceProvider.GetService<IJobFactory>();

5.测试

        static async Task Main(string[] args)
        {
            var serviceProvider = ConfigureServices();

            var scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            // JobFactory替换为IJobFactory实现类的实例
            scheduler.JobFactory = serviceProvider.GetService<IJobFactory>();

            var jobSchedule = serviceProvider.GetService<TestClass>();
            var jobDetail = JobBuilder.Create(jobSchedule.JobType).Build();
            var trigger = TriggerBuilder.Create()
                .WithCronSchedule(jobSchedule.CronExpression)
                .Build();

            await scheduler.ScheduleJob(jobDetail, trigger);
            await scheduler.Start();

            Thread.Sleep(10000);
        }

 


http://www.kler.cn/a/293003.html

相关文章:

  • 【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩
  • odoo 17 后端路由接口认证自定义
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • 《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
  • Vue 3 介绍及应用
  • 【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
  • GitHub Copilot的详细介绍
  • RHCE必过技巧,无需本人参加也可拿证?
  • 紫光展锐完成Android 15同步升级,驱动技术创新与生态共赢
  • 【区块链 + 人才服务】紫金研究院知识库管理系统 | FISCO BCOS应用案例
  • GAMES101(0~1作业)
  • django企业开发实战-学习小结1
  • hiprint打印/jsPDF使用/html2canvas
  • 本地使用Docker部署Nexus Maven私有仓库工具结合内网穿透实现远程管理
  • AI学习记录 - 旋转位置编码
  • python爬虫教学(四) Bs4
  • 最新版本是 FL Studio 的 24.1.1.4285 2024/08/07发布
  • 【2024数模国赛赛题思路公开】国赛C题第二套思路丨附可运行代码丨无偿自提
  • VS2022如何安装Spy+
  • ansible实战自动化运维项目
  • 优化 Webpack 打包体积的思路
  • vue3 uni app端使用uCharts
  • 华为鸿蒙系统和安卓的区别
  • java后端框架
  • 【Python机器学习】NLP词频背后的含义——反馈及改进
  • 数值分析中插值法和拟合法的对比