.net Core Quartz Dependency Injection

后端 未结 4 2005
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-03 07:34

How can I configure Quartz in .net core to use dependency injection? I using standard .net core Dependency mechanism. In constructor of class that implemen

4条回答
  •  自闭症患者
    2020-12-03 08:03

    Inspired by Rabbans great answer I created a complete implementation of a JobFactory for Microsoft.Extensions.DependencyInjection:

    Implementation

    using Microsoft.Extensions.DependencyInjection;
    using Quartz;
    using Quartz.Spi;
    using System;
    using System.Collections.Concurrent;
    
    class JobFactory : IJobFactory
    {
        protected readonly IServiceProvider _serviceProvider;
    
        protected readonly ConcurrentDictionary _scopes = new ConcurrentDictionary();
    
        public JobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            var scope = _serviceProvider.CreateScope();
            IJob job;
    
            try
            {
                job = scope.ServiceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
            }
            catch
            {
                // Failed to create the job -> ensure scope gets disposed
                scope.Dispose();
                throw;
            }
    
            // Add scope to dictionary so we can dispose it once the job finishes
            if (!_scopes.TryAdd(job, scope))
            {
                // Failed to track DI scope -> ensure scope gets disposed
                scope.Dispose();
                throw new Exception("Failed to track DI scope");
            }
    
            return job;
        }
    
        public void ReturnJob(IJob job)
        {
            if (_scopes.TryRemove(job, out var scope))
            {
                // The Dispose() method ends the scope lifetime.
                // Once Dispose is called, any scoped services that have been resolved from ServiceProvider will be disposed.
                scope.Dispose();
            }
        }
    }
    

    Usage

    // Prepare the DI container
    var services = new ServiceCollection();
    // Register job
    services.AddTransient();
    // Register job dependencies
    services.AddTransient();
    var container = services.BuildServiceProvider();
    
    // Create an instance of the job factory
    var jobFactory = new JobFactory(container);
    
    // Create a Quartz.NET scheduler
    var schedulerFactory = new StdSchedulerFactory(properties);
    var scheduler = schedulerFactory.GetScheduler();
    
    // Tell the scheduler to use the custom job factory
    scheduler.JobFactory = jobFactory;
    

    The implementation has been tested in a .NET Core 2.1 console application with a single job and worked fine. Feel free to leave your feedback or improvement suggestions...

提交回复
热议问题