如何在 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)
我正在尝试在 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)