如何在 Controller 中解析 HostedService

How to resolve HostedService in Controller

我正在尝试在 ASP.NET Core 3.0 中添加一个后台计时器,它会定期执行任务。 Google 引导我到 this,我在那里实现了 'Timed background tasks'。 但是,我一直在解决控制器中的 HostedService。 我需要一个特定的 TimedHealthCheckService 实例,这样我就可以调用另一个名为 'GetAvailableODataUrl()'.

的 public 函数

startup.cs中我使用了下面的代码:

services.AddHostedService<TimedHealthCheckService>();

TimedHealthCheckService 显然实现了 IHostedService:

public class TimedHealthCheckService : IHostedService, IDisposable                  

在我的控制器中,我有以下构造函数:

public HealthCheckController(ILogger<HealthCheckController> logger, IHostedService hostedService)
{
  this.logger = logger;
  this.timedHealthCheckService = hostedService as TimedHealthCheckService;
}

但是,当我启动 WebAPI 时,timedHealthCheckService 始终为空。 似乎另一个 IHostedService 被注入到构造函数中。查看hostedService,其实是一个GenericWebHostService类型的对象。

如果我将控制器的构造函数更改为:

public HealthCheckController(ILogger<HealthCheckController> logger, TimedHealthCheckService hostedService)

我收到以下错误:

在尝试激活 'HealthCheck.Web.Controllers.HealthCheckController' 时无法解析类型 'HealthCheck.Web.TimedHealthCheckService' 的服务。

我也试过 services.AddSingleton<IHostedService, TimedHealthCheckService>(); 结果一样。

试试 startup.cs 中的这两行:

services.AddSingleton<TimedHealthCheckService>();
services.AddHostedService<TimedHealthCheckService>(provider => provider.GetService<TimedHealthCheckService>());

上面的第一行告诉服务提供商创建一个单例并将其提供给任何想要 TimedHealthCheckService 的人,例如您的控制器的构造函数。但是,服务提供者不知道单例实际上是一个 IHostedService 并且您希望它调用 StartAsync().

第二行告诉服务提供商您要添加托管服务,因此它会在应用程序启动时调用 StartAsync() 运行。 AddHostedService 接受 Func<IServiceProvider,THostedService> 回调。我们提供的回调从服务提供商那里获取单例 TimedHealthCheckService,然后 returns 将其作为 IHostedService 返回给服务提供商。服务提供商然后调用其 StartAsync() 函数。

在你的控制器中:

public HealthCheckController(ILogger<HealthCheckController> logger, TimedHealthCheckService hostedService)