Quartz.Net 使用Autofac實現依賴注入


    相信大家使用quartz.net 肯定遇到過job類無法依賴注入的問題,因為job類必須要有無參數的構造函數,於是我就各種搜,大部分是水文。。。

因為有人說用到Autofac,但是沒寫全,用不起來,所以我就去找了一下,被我找到了Autofac.Extras.Quartz 這個東西可以幫助我們依賴注入。

參考了它的GitHub源碼地址上的例子:https://github.com/alphacloud/Autofac.Extras.Quartz

首先我們引入nuget包:Autofac和Autofac.Extras.Quartz。

然后寫入注冊方法:


using Autofac; using Autofac.Extras.Quartz; using Q1.Operation.Scheduler.Services; using System.Reflection; namespace Q1.Operation.Scheduler.Module { /// <summary> /// autofac /// </summary> public class JobModule { public static ContainerBuilder ConfigureContainer(ContainerBuilder cb) { cb.RegisterModule(new QuartzAutofacFactoryModule()); cb.RegisterModule(new QuartzAutofacJobsModule(typeof(JobOperation).Assembly)); RegisterComponents(cb); return cb; } public static void RegisterComponents(ContainerBuilder cb) { // register dependencies cb.RegisterType<MongoService>().As<IMongoService>(); } }
}

這里有兩個問題:JobOperation是繼承 IJob的執行類,以及MongoService 是我們要在執行類注入的類。再來看看如何創建job的:

        public async void CreateJob(JobInput jobInput)
        {

            IContainer container = JobModule.ConfigureContainer(new ContainerBuilder()).Build();

            IJobDetail job = JobBuilder.Create<JobOperation>()
                             .WithIdentity(jobInput.JobName, jobInput.GroupName)
                             .Build();

            ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
                                       .StartNow()
                                       .WithIdentity(jobInput.JobName, jobInput.GroupName)
                                       .WithCronSchedule(jobInput.Cron)
                                       .Build();

            var cts = new CancellationTokenSource();
            var scheduler = container.Resolve<IScheduler>();
            await scheduler.ScheduleJob(job, cronTrigger, cts.Token);

            await scheduler.Start();
        }

這里可以看到scheduler是通過container創建的。

上文的JobOperation是我們的執行方法:

 public class JobOperation : IJob
    {
        private readonly IMongoService _jobsService;

        public JobOperation(IMongoService jobsService)
        {
            _jobsService = jobsService;
        }

        /// <summary>
        /// 觸發器觸發之后執行的方法
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Execute(IJobExecutionContext context)
        {
            var name = context.JobDetail.Key.Name;

            System.Console.WriteLine(name);           
        }
    }

可以看到這里的執行類是有構造函數注入IMongoService 的。

這樣就可以完成依賴注入了。

未經作者允許,禁止轉載和其他用途。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM