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
}
}
}