首页 > 解决方案 > 如何在 Quartz.NET 作业中注入 NavigationManager?

问题描述

我有一个使用 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 集线器方法。按照微软文档中的代码,为了创建集线器连接,我需要做这样的事情......

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

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

public const string Endpoint = "/EmailHub";

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

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

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

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

任何人都能够解释出了什么问题,以及我如何解决它?谢谢

标签: c#blazor-server-sidequartz.net

解决方案


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

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


推荐阅读