我需要获得注册托管服务的参考:
services.AddHostedService<DataCollectingService>();
它实现了IHostedService
接口,并在Web应用程序启动时正确启动。
我需要在某些控制器中获取服务的引用并访问对象的公共成员。
以下代码不起作用。 xService
为空。
public IActionResult T()
{
using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var xService = serviceScope.ServiceProvider.GetService<DataCollectingService>();
}
return RedirectToAction(nameof(Index));
}
答案 0 :(得分:1)
适用于 .Net Core 3.1+ 的答案由原始问题的 gunr2171 中的 3rd comment 给出:
IEnumerable<IHostedService> allHostedServices = this.serviceProvider.GetService<IEnumerable<IHostedService>>();
将返回对托管服务的现有实例的引用。
答案 1 :(得分:0)
我暂时通过在开始时设置的类中静态存储引用来处理此问题。
答案 2 :(得分:0)
我将所有功能移至Singleton,然后在启动时执行类似的操作
services.AddSingleton<DataCollectingService>();
services.AddHostedService<HostedServiceUsingTheDataCollectionService>();
然后我可以将Singleton注入控制器中。
我不确定Core是否会处理相同的引用(我认为在Core 3中会是这种情况,对于<= 2.2不太确定),但是我会尝试一下。