8 24 81

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 的。

这样就可以完成依赖注入了。

未经作者允许,禁止转载和其他用途。

posted @   Ivan_Ivan  阅读(1750)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示