相信大家使用quartz.net 肯定遇到过job类无法依赖注入的问题,因为job类必须要有无参数的构造函数,于是我就各种搜,讲道理全是水文,,,还一堆复制粘贴盗博客的。。。看来it圈也有抄袭党啊。
因为有人说用到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 的。
这样就可以完成依赖注入了。
未经作者允许,禁止转载和其他用途。