using Microsoft.Extensions.DependencyInjection; using Quartz.Spi; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Elight.Logic.Job { /// /// 该工厂将一个IServiceProvider传入构造函数中,并实现IJobFactory接口。 /// /// Author:mxg /// CreatedTimed:2020-06-16 11:40 public class JobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public JobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); } /// /// 在这个方法中工厂必须返回Quartz调度程序所请求的IJob。在此实现中,我们直接委托给IServiceProvider,并让DI容器找到所需的实例。由于GetRequiredService的非泛型版本返回的是一个对象,因此我们必须在末尾将其强制转换成IJob。 /// /// /// /// public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { return (_serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob)!; } /// /// 该ReturnJob方法是调度程序尝试返回(即销毁)工厂创建的作业的地方。不幸的是,使用内置的IServiceProvider没有这样做的机制。我们无法创建适合Quartz API所需的新的IScopeService,因此我们只能创建单例作业。 /// /// public void ReturnJob(IJob job) { // we let the DI container handler this } } }