如何在 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】:您的主要问题是NavigationManager
在Circuit
之外无法正常工作,并且(大概)为应用程序设置了一次 Quartz。因此,DI 没有可以提供NavigationManager
的范围。
在类似的情况下,我通常会在appsettings.json中设置网站的基本url,并用它来构造我需要的绝对url。
【讨论】:
感谢您的回复。这就是我最终做的。可惜,本来不错的。以上是关于如何在 Quartz.NET 作业中注入 NavigationManager?的主要内容,如果未能解决你的问题,请参考以下文章