【问题标题】:.NET Core Hosted Service.NET Core 托管服务
【发布时间】:2019-06-10 20:03:11
【问题描述】:

我需要获得注册托管服务的参考:

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));
}

【问题讨论】:

  • 为什么不要求其他服务在您的控制器和托管服务之间传送信息?某种缓存层。
  • 这是我的备份计划 - 使用一些静态属性,它会在启动后由服务填充。但我想有一些“更正确”的方式来获取参考。
  • 所以根据source code,该项目被注册为IHostedService。您应该可以在控制器的构造函数中请求IEnumerable&lt;IHostedService&gt;。但我认为您不能直接按名称要求托管服务。
  • 好吧,您还可以在代码中创建新范围,这样您的后台服务将立即超出范围。
  • IEnumerable 在控制器的构造函数中不起作用。它创建了一个新实例,但我需要原始引用。

标签: c# asp.net-core asp.net-core-hosted-services


【解决方案1】:

在.Net Core 3.1+ 中有效的答案由gunr2171 在原始问题的3rd comment 中给出:

IEnumerable<IHostedService> allHostedServices = this.serviceProvider.GetService<IEnumerable<IHostedService>>();

将返回对托管服务现有实例的引用。

【讨论】:

    【解决方案2】:

    我已经通过在启动期间设置的类中静态存储引用来临时处理这个问题。

    【讨论】:

      【解决方案3】:

      我会将所有功能移至 Singleton,然后在我的创业公司中我会做类似的事情

      services.AddSingleton<DataCollectingService>();
      services.AddHostedService<HostedServiceUsingTheDataCollectionService>();
      

      然后我可以在控制器中注入单例。

      我不确定 Core 是否会处理相同的引用(我认为在 core 3 中会是这种情况,对于

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 2020-02-07
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多