You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.8 KiB
47 lines
1.8 KiB
2 years ago
|
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
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 该工厂将一个IServiceProvider传入构造函数中,并实现IJobFactory接口。
|
||
|
/// </summary>
|
||
|
/// 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));
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 在这个方法中工厂必须返回Quartz调度程序所请求的IJob。在此实现中,我们直接委托给IServiceProvider,并让DI容器找到所需的实例。由于GetRequiredService的非泛型版本返回的是一个对象,因此我们必须在末尾将其强制转换成IJob。
|
||
|
/// </summary>
|
||
|
/// <param name="bundle"></param>
|
||
|
/// <param name="scheduler"></param>
|
||
|
/// <returns></returns>
|
||
|
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
|
||
|
{
|
||
|
return (_serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob)!;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 该ReturnJob方法是调度程序尝试返回(即销毁)工厂创建的作业的地方。不幸的是,使用内置的IServiceProvider没有这样做的机制。我们无法创建适合Quartz API所需的新的IScopeService,因此我们只能创建单例作业。
|
||
|
/// </summary>
|
||
|
/// <param name="job"></param>
|
||
|
public void ReturnJob(IJob job)
|
||
|
{
|
||
|
// we let the DI container handler this
|
||
|
}
|
||
|
}
|
||
|
}
|