Quartz.net-IJobFactory實(shí)現(xiàn)任務(wù)實(shí)例創(chuàng)建的依賴注入

# ## Quartz.net-IJobFactory實(shí)現(xiàn)任務(wù)實(shí)例創(chuàng)建的依賴注入 ## #

在使用Quartz.net執(zhí)行調(diào)度任務(wù)時(shí),任務(wù)類必須實(shí)現(xiàn)IJob接口,如下
`public class DLLExecutor : IJob
 {
    public async Task Execute(IJobExecutionContext context)
        {
            //你的處理邏輯
        
        }
 }`

具備如上任務(wù)類之后,需要做的就是與JobDetial、Trigger進(jìn)行關(guān)聯(lián),為了精簡(jiǎn),忽略JobDetial、Trigger相關(guān)屬性設(shè)置,代碼如下

`   //方式 1
    Type type = typeof(DLLExecutor);
    var jobBuilder = JobBuilder.Create(type);

    //方式 2
    var jobBuilder = JobBuilder.Create<DLLExecutor>();

    //創(chuàng)建ITrigger
    var triggerBuilder = TriggerBuilder.Create();
    
    //調(diào)度器
    var _scheduler = new StdSchedulerFactory().GetScheduler().GetAwaiter().GetResult();

    //綁定
    _scheduler.ScheduleJob(jobDetail, iTrigger);
    
`

好的,最簡(jiǎn)易的任務(wù)創(chuàng)建綁定完成,通過如上代碼可知道,如果想在任務(wù)類中增加部分動(dòng)態(tài)屬性,只能**使用靜態(tài)變量進(jìn)行處理,且必須在使用前對(duì)靜態(tài)變量進(jìn)行賦值**,代碼如下

`public class DLLExecutor : IJob
 {
    //日志組件,默認(rèn)Log4Net,但也允許是Log4net、Nlog、ExceptionLess等等
    public static ILogger Logger =log4net;

    public async Task Execute(IJobExecutionContext context)
        {
            //你的處理邏輯
            
        }
 }`
所以如果你要使用非默認(rèn),你只能在綁定JobDetail之前進(jìn)行賦值,代碼如下

`
    //先賦值再使用
    DLLExecutor.Logger = Exceptionless;

    //方式 1
    Type type = typeof(DLLExecutor);
    var jobBuilder = JobBuilder.Create(type);

    //方式 2
    var jobBuilder = JobBuilder.Create<DLLExecutor>();

    //創(chuàng)建ITrigger
    var triggerBuilder = TriggerBuilder.Create();
    
    //調(diào)度器
    var _scheduler = new StdSchedulerFactory().GetScheduler().GetAwaiter().GetResult();

    //綁定
    _scheduler.ScheduleJob(jobDetail, iTrigger);

`

從上述代碼看,功能是完成,運(yùn)行也是正常的,但問題來(lái)了,如果我用很多個(gè)類似于DLLExecutor的任務(wù)類,但可能需要特別處理的就不是日志組件了,該怎么辦?
1、在var jobBuilder = JobBuilder.Create(type)前一個(gè)一個(gè)的處理 ,
    請(qǐng)告訴我你不想(否則下面寫不下去了)

2、使用IJobFactory,實(shí)現(xiàn)依賴注入

### IJobFactory使用 ###

首先改造任務(wù)類DLLExcecutor

`public class DLLExecutor : IJob
 {
    
    //日志組件,默認(rèn)Log4Net,但也允許是Log4net、Nlog、ExceptionLess等等
    
    //此時(shí)不需要是static,至于修飾符,個(gè)人習(xí)慣,可手動(dòng)忽略

    protectd ILogger Logger =log4net;
    
    //因?yàn)槭褂玫氖?Net Core ,添加構(gòu)造函數(shù),用于注入
    //其他注入框架的話,自行選擇合適的注入方式
    public DLLExecutor(ILogger logger)
    {
        Logger = logger;
    }
    
    public async Task Execute(IJobExecutionContext context)
        {
            //你的處理邏輯
            
        }
 }`

完成任務(wù)類改造之后,在應(yīng)用中進(jìn)行注冊(cè),代碼如下
`
    //添加DLL執(zhí)行者,生命周期自行決定
    services.AddSingleton<DLLExecutor>();

`

接著需要先創(chuàng)建個(gè)實(shí)現(xiàn)IJobFactory的工廠類,然后注冊(cè)(是依賴注入還是自己new,隨意,如果非注入方式,你就得思考怎么new了,本例全程使用注入方式)
`
    public class DefaultScheduleServiceFactory : IJobFactory
    {
        /// <summary>
        /// 容器提供器,
        /// </summary>
        protected IServiceProvider _serviceProvider;

        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        /// <param name="serviceProvider"></param>
        public DefaultScheduleServiceFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        /// <summary>
        /// 返回IJob
        /// </summary>
        /// <param name="bundle"></param>
        /// <param name="scheduler"></param>
        /// <returns></returns>
        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            //Job類型
            Type jobType = bundle.JobDetail.JobType;

            //返回jobType對(duì)應(yīng)類型的實(shí)例
            return _serviceProvider.GetService(jobType) as IJob;
        }

        /// <summary>
        /// 清理銷毀IJob
        /// </summary>
        /// <param name="job"></param>
        public void ReturnJob(IJob job)
        {
            var disposable = job as IDisposable;

            disposable?.Dispose();
        }
    }
`

完成IJobFactory工廠類之后,需要做的就是與JobDetial、Trigger進(jìn)行關(guān)聯(lián),對(duì)最原始的進(jìn)行代碼進(jìn)行修改,代碼如下

`   //方式 1
    Type type = typeof(DLLExecutor);
    var jobBuilder = JobBuilder.Create(type);

    //方式 2
    var jobBuilder = JobBuilder.Create<DLLExecutor>();

    //創(chuàng)建ITrigger
    var triggerBuilder = TriggerBuilder.Create();
    
    //調(diào)度器
    var _scheduler = new StdSchedulerFactory().GetScheduler().GetAwaiter().GetResult();

    //使用IJobFactory,jobFactory為實(shí)現(xiàn)IJobFactory接口的實(shí)例
    _scheduler.IJobFactory = jobFactory;

    //綁定,
    //個(gè)人理解:猜測(cè)是在trigger觸發(fā)時(shí)獲取IJob,不知道是否正確,歡迎指正
    _scheduler.ScheduleJob(jobDetail, iTrigger);
    
`

到此,注入方式的實(shí)現(xiàn)全部已完成;個(gè)人覺得IJobFactory沒啥特別的,核心還是在于內(nèi)部注入鏈的流向;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容