【问题标题】:How to properly use DI with Quartz.NET IScheduler?如何在 Quartz.NET IScheduler 中正确使用 DI?
【发布时间】:2021-03-13 22:52:33
【问题描述】:

我正在开发一个 Asp.Net Core 3.1 应用程序,我需要在其中安排不同类型的作业。我们使用 Scoped 作业来处理 Scoped 服务(如 dbcontext)。最近,Quartz.NET 在 UseMicrosoftDependencyInjectionScopedJobFactory 的帮助下支持开箱即用的作用域作业(如官方文档中所述)。

但是,我不确定如何注册实际的调度程序以便将其注入我的服务并能够在运行时调度新作业。

我知道我可以通过这样做来获得 IScheduler:

ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
     scheduler = schedulerFactory.GetScheduler();

但我还没有找到任何关于如何在我的实际服务管道中注册它的文档。 这样做的正确/推荐/记录方式是什么?

【问题讨论】:

标签: c# .net dependency-injection asp.net-core-3.1 quartz.net


【解决方案1】:

Docs 描述了如何将Quartz.NET 与 DI 容器一起使用。所以最好先检查描述的例子。

关于ISchedulerFactory 与作用域服务的动态解析,一旦你调用,工厂就会在容器中注册:

serviceCollection.AddQuartz(q => 
{
   ...
   // your configuration
   ...
   q.UseMicrosoftDependencyInjectionScopedJobFactory()
   ...
})

因此,您可以在您的服务中注入 ISchedulerFactory 并对其执行操作。

【讨论】:

  • 我还是有点困惑,因为我希望调度程序与应用程序的其余部分一起自动启动。我有一个定制的 SchedulerService,它旨在在其他服务中实现以在运行时安排作业。但是,如果我的 SchedulerService 注入了 SchedulerFactory,得到一个新的 Scheduler 并启动它,难道不会有大量并行启动的调度程序在运行吗?
  • 您能否添加使用示例,以便我的回答更加具体? SchedulerFactory.Get 不会创建新的调度器,它将返回默认注册的调度器(更多here你可以通过传递的id获取你的调度器实例)
猜你喜欢
  • 2022-08-02
  • 2021-11-15
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2013-12-22
  • 2011-01-11
  • 2023-03-28
相关资源
最近更新 更多