using Microsoft.Extensions.DependencyInjection; using Quartz; using Quartz.Spi; using System; namespace HT.Cloud.Service.AutoJob { /// /// 依赖注入必须,代替原本的SimpleJobFactory /// public class IOCJobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public IOCJobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { var serviceScope = _serviceProvider.CreateScope(); // 获得一个ioc对象,指定创建scope级别的实例(在job里面需要依赖注入ef,但是startup里面配置的ef是scope级别的,必须指定为scope,不然报错)。不写的话,默认是单例。 return serviceScope.ServiceProvider.GetService(bundle.JobDetail.JobType) as IJob; // 依赖注入一个 job 然后返回 } public void ReturnJob(IJob job) { var disposable = job as IDisposable; disposable?.Dispose(); } } }