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

How do I inject NavigationManager in a Quartz.NET job?

我有一个 Blazor 服务器端应用程序,它使用 Quartz.NET 到 运行 计划作业。该作业仅调用注入的助手 class...

  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 等。那部分工作正常。

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

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

...其中 EmailNotifierHub 包含以下行...

public const string Endpoint = "/EmailHub";

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

System.InvalidOperationException' in Microsoft.AspNetCore.Components.dll 'RemoteNavigationManager' has not been initialized

NavigationManager 的实例注入正常,这意味着它不是 null,只有当它试图调用 ToAbsoluteUri

时才会出现异常

我之前在注入 classes 时做过这种事情,但在 Quartz.NET 作业中没有,我怀疑问题出在这里。

谁能解释出问题所在以及我该如何解决?谢谢

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

的范围

在类似的情况下,我通常会放弃在 appsettings.json 中设置站点的基础 url,并使用它来构建我需要的绝对 url。