# ## 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ù)。