Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决控制器中的HostedService_C#_Asp.net Core 3.0 - Fatal编程技术网

C# 如何解决控制器中的HostedService

C# 如何解决控制器中的HostedService,c#,asp.net-core-3.0,C#,Asp.net Core 3.0,我试图在ASP.NET Core 3.0中添加一个后台计时器,它定期执行任务。 谷歌把我带到了谷歌,在那里我实现了“定时后台任务”。 但是,我一直在解决控制器中的HostedService。 我需要TimedHealthCheckService的特定实例,以便调用另一个名为“GetAvailableDataUrl()”的公共函数 在startup.cs中,我使用以下代码: services.AddHostedService<TimedHealthCheckService>();

我试图在ASP.NET Core 3.0中添加一个后台计时器,它定期执行任务。 谷歌把我带到了谷歌,在那里我实现了“定时后台任务”。 但是,我一直在解决控制器中的HostedService。 我需要TimedHealthCheckService的特定实例,以便调用另一个名为“GetAvailableDataUrl()”的公共函数


startup.cs
中,我使用以下代码:

services.AddHostedService<TimedHealthCheckService>();
在我的控制器中,我有以下构造函数:

public HealthCheckController(ILogger<HealthCheckController> logger, IHostedService hostedService)
{
  this.logger = logger;
  this.timedHealthCheckService = hostedService as TimedHealthCheckService;
}
我得到以下错误:

尝试激活“HealthCheck.Web.Controllers.HealthCheckController”时,无法解析类型“HealthCheck.Web.TimedHealthCheckService”的服务


我还尝试了
services.AddSingleton()在startup.cs中尝试以下两行:

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

为什么需要注入托管服务?这可能是一个错误。托管服务由框架自动启动,因此我试图理解为什么需要将服务的实例注入控制器中。@Nkosi此hostedService将保持实际运行状况。所以我想直接从hostedService获取这个状态。我建议更改设计。拥有一个可以注入控制器和托管服务的中间服务。使服务成为单例服务,以便状态可以在them@Nkosi我想这是一个可行的选择,谢谢。然而,我仍然想知道为什么IHostedService不能按预期注入。是设计的吗?太好了,现在可以了,谢谢。您能否详细说明为什么需要IServiceProvider?在asp.net core 2.1中,AddHostedService不接受参数。有没有关于如何绕过此问题的建议?文档声称采用Func参数的AddHostedService重载在2.1中可用:
public HealthCheckController(ILogger<HealthCheckController> logger, TimedHealthCheckService hostedService)
services.AddSingleton<TimedHealthCheckService>();
services.AddHostedService<TimedHealthCheckService>(provider => provider.GetService<TimedHealthCheckService>());
public HealthCheckController(ILogger<HealthCheckController> logger, TimedHealthCheckService hostedService)