Планирование работы Quartz.net с внедрением зависимостей - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю над своим первым проектом с EF Core и Dependency Injecion для контекста БД.Однако я столкнулся с проблемой, потому что Quartz.net 3, кажется, не позволяет какие-либо параметры в классе ImportJob.Так что мой метод DI не работает в этом случае.Я знаю, что хочу новый контекст, потому что он будет работать в фоновом режиме, есть ли другой способ создания контекста БД, чтобы я мог выполнить эту задачу?

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

1 Ответ

0 голосов
/ 04 апреля 2019

Одним из способов является использование 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 создает задание , он использует вашу фабрику и контейнер для ускорения задания, допускающего инъекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...