• Quarz.Net 使用Autofac实现依赖注入


        相信大家使用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 的。

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

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

  • 相关阅读:
    C#初级知识点整理及VS的简单使用
    C#更新SQLServer中的TimeStamp字段(时间戳) 防止同时修改一行时覆盖更新
    多线程传入参数
    ASP.NET 下载文件并继续执行JS解决方法
    C# webBrowser控件使用
    模拟操作网页 webBrowser
    ASP.net绑定文本框Enter事件到按钮 ASP.NET执行后台执行JS方法
    C#复制、粘贴文本信息到剪贴板
    组合数获取算法
    XML序列化与反序列化
  • 原文地址:https://www.cnblogs.com/Ivan-Wu/p/12986075.html
Copyright © 2020-2023  润新知