Одним из способов является использование StdSchedulerFactory , фабрики заданий, которая реализует IJobFactory и принимает IServiceProvider
Пример
public class JobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public JobFactory(IServiceProvider serviceProvider)
=> _serviceProvider = serviceProvider;
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
try
{
var jobDetail = bundle.JobDetail;
var jobType = jobDetail.JobType;
return _serviceProvider.GetService(jobType) as IJob;
}
catch (Exception ex)
{
throw new SchedulerException($"Problem instantiating class '{bundle.JobDetail.JobType.FullName}'", ex);
}
}
public void ReturnJob(IJob job)
=> (job as IDisposable)?.Dispose();
}
В зависимости от вашей структуры DI, регистрация будет выглядеть примерно так
// register, your container as an IServiceProvider
container.RegisterInstance<IServiceProvider>(container);
// create the scheduler
var scheduler = await StdSchedulerFactory.GetDefaultScheduler(cancellationTokenSource.Token);
// add your factory to the scheduler
scheduler.JobFactory = new JobFactory(container);
// register the scheduler
container.RegisterInstance(scheduler);
// register your jobs
container.Collection.Register<IJob>(GetType().Assembly);
Тогда ваша работа может выглядеть следующим образом
public class ImportJob : IJob
{
private readonly SContext _db;
//Quartz.net doesn't appear to like that I'm injecting these,
//because if I remove this parameter, execute...executes.
public ImportJob(SContext db)
{
_db = db;
}
public Task Execute(IJobExecutionContext context)
{
var cc = new CC(_db);
return Task.CompletedTask;
}
}
Примечание : это базовая идея, а не полный пример, и она во многом будет зависеть от ваших собственных настроек и структуры
Короче говоря,вышеописанное делает, когда Quartz создает задание , он использует вашу фабрику и контейнер для ускорения задания, допускающего инъекцию.