c# - 如何在 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 工作中,我怀疑问题出在哪里。
任何人都能够解释出了什么问题,以及我如何解决它?谢谢
解决方案
您的主要问题是它NavigationManager
在 a 之外无法正常工作Circuit
,并且 Quartz (大概)为应用程序设置了一次。因此,DI 没有可以提供NavigationManager
.
在类似的情况下,我通常会在 appsettings.json 中设置站点的基本 url,并使用它来构造我需要的绝对 url。
推荐阅读
- javascript - 如何确保页面已在 React 站点上完成加载
- c++ - 使用 Eigen::CholmodSupernodalLLT 时如何提取 matrixL() 和 matrixU()?
- c# - 调用 Play() 后 CrossMediaManager.Current.Status 没有改变
- swift - Swift 5 哪个是 uialertController 中完成处理程序的更好用法?
- design-patterns - 使用 redux 和类对象时如何修复重复的数据位置
- r - 当 selectInput() 改变时从 sliderInput() 更改为 numericInput()
- ghostscript - 我有一个横向 PDF,需要以纵向模式打印在 Zebra 标签上?我应该怎么办?
- excel - 如何使用 VBA 分配 IF(INDEX(MATCH 公式?
- python - 将音乐与广告分开
- javascript - SheetJS 和 FileSaver(vuejs 项目):内存不足