如何在 Quartz.NET 作业中注入 NavigationManager?

Posted

技术标签:

【中文标题】如何在 Quartz.NET 作业中注入 NavigationManager?【英文标题】:How do I inject NavigationManager in a Quartz.NET job? 【发布时间】:2021-12-05 01:06:46 【问题描述】:

我有一个使用 Quartz.NET 运行计划作业的 Blazor 服务器端应用程序。该作业只是调用一个注入的辅助类...

  public class DownloadEmailsJob : IJob 
    private readonly EmailDownloadHelper _edh;

    public DownloadEmailsJob(EmailDownloadHelper edh) =>
      _edh = edh;

    public async Task Execute(IJobExecutionContext context) =>
      await _edh.DownloadEmails();
  

EmailDownloadHelper 使用注入来获取各种服务,例如DbContext 等。这部分工作正常。

我现在需要从辅助类内部调用 SignalR 集线器方法。按照代码in Microsoft's documentation,为了创建集线器连接,我需要做这样的事情......

_hubConnection = new HubConnectionBuilder()
  .WithUrl(_navigationManager.ToAbsoluteUri(EmailNotifierHub.Endpoint))
  .Build();

...EmailNotifierHub 包含以下行...

public const string Endpoint = "/EmailHub";

这意味着我的工作需要NavigationManager 的实例。我尝试在构造函数中注入它(就像我对此类中的其他依赖项所做的那样),但是当它尝试创建集线器连接时,我得到一个异常......

Microsoft.AspNetCore.Components.dll 中的 System.InvalidOperationException' “RemoteNavigationManager”尚未初始化

NavigationManager 的实例被很好地注入,这意味着它不为空,并且只有在尝试调用 ToAbsoluteUri 时才会出现异常

我以前在注入的类中做过这种事情,但不是在 Quartz.NET 作业中,这就是我怀疑问题所在。

谁能解释出了什么问题,我该如何解决?谢谢

【问题讨论】:

【参考方案1】:

您的主要问题是NavigationManagerCircuit 之外无法正常工作,并且(大概)为应用程序设置了一次 Quartz。因此,DI 没有可以提供NavigationManager 的范围。

在类似的情况下,我通常会在appsettings.json中设置网站的基本url,并用它来构造我需要的绝对url。

【讨论】:

感谢您的回复。这就是我最终做的。可惜,本来不错的。

以上是关于如何在 Quartz.NET 作业中注入 NavigationManager?的主要内容,如果未能解决你的问题,请参考以下文章

Quartz.Net

Quartz.NET 入门

Quartz.NET开源作业调度架构

从控制器手动触发 Quartz.net 作业

使用 Quartz.NET 和 Simple Injector 进行构造函数注入

开源作业调度框架 - Quartz.NET - 实战使用2