【问题标题】:dependency injection of Scheduler Quartz now works properlyScheduler Quartz 的依赖注入现在可以正常工作
【发布时间】:2020-11-19 20:22:49
【问题描述】:

我正在尝试以这种方式使用 Quartz SchedulerFactory:

我正在像这样在 IServiceCollection 中将调度程序工厂添加为单例对象:

services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();

在此之后,我有一个命令处理程序,我试图将这个 SchedulerFactory 注入命令处理程序的构造函数:

    private readonly ISchedulerFactory _schedulerFactory;

    public TestCommandHandler(ISchedulerFactory schedulerFactory)
    {
        _schedulerFactory = schedulerFactory;
    }

但是当我尝试启动应用程序时,服务提供商会为命令处理程序抛出此错误:

尝试激活时无法解析类型“Quartz.ISchedulerFactory”的服务

为什么服务找不到 ISchedulerFactory 的实现,尽管我已将它作为单例添加到服务中?

【问题讨论】:

  • 嗨。也许 ISchedulerFactory 有一些未注册的依赖项?就像你向 StdSchedulerFactory 注入了一些东西,但你还没有在 DI 中注册?
  • 将 StdSchedulerFactory 类添加到您的问题中
  • @OlegI StdSchedulerFactory 是 Quartz 包附带的内置类,该类是 ISchedulerFactory 的默认实现。
  • 我找到了解决方案,我通过使用services.getService&lt;IScheduleFactory&gt;() ant 获得了调度器工厂的实例,它可以工作。
  • 如果可以从IServiceProvider获取服务,但是在ctor中注入却不起作用,那就有问题了。你在 DI 中注册你的 TestCommandHandler 吗?

标签: c# .net-core quartz.net


【解决方案1】:

由于您使用的是应用程序生命周期范围,因此您也可以创建一个实例并将其注册为“单例”。

这排除了导致此类错误的任何非托管依赖项,例如 COM 组件的注册。

var instance = new StdSchedulerFactory(/*whatever needed for initialization*/);
services.AddSingleton<ISchedulerFactory>(instance);

【讨论】:

  • 那么,你可以这样做:new StdSchedulerFactory(/*whatever needed for initialization*/);?
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2015-11-08
相关资源
最近更新 更多