簡體   English   中英

使用依賴注入調度 Quartz.net 作業

[英]Scheduling a Quartz.net Job with dependency-injection

我正在使用 EF Core 和 DB Context 的依賴注入開發我的第一個項目。 但是我遇到了一個問題,因為 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;
    }
}

一種方法是使用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 創建一個作業時,它會使用您的工廠和容器來啟動該作業以進行注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM