asp.net-core - Blazor:如何获取托管服务实例?
问题描述
我添加了一个后台服务,它会定期做一些事情,比如官方示例。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddHostedService<TimedHostedService>(); <-- here
services.AddSingleton<WeatherForecastService>();
}
TimedHostedService具有StartAsync
和StopAsync
。_ 最终,我想在网络浏览器中调用这些。
在FetchData.razor
默认脚手架的文件中,我尝试直接引用该服务,但这不起作用。因此,我在 click 事件中添加了Start
和Stop
方法并调用了它们。WeatherForecastService
<button @onclick="()=> { ForecastService.Stop(); }">Stop</button>
现在,问题是,我不知道如何TimedHostedService
在Stop
.WeatherForecastService
public class WeatherForecastService
{
....
public void Stop()
{
//how to get TimedHostedService instance?
}
....
}
我曾尝试使用依赖注入来获取服务提供者,但GetService
返回 null。
IServiceProvider sp;
public WeatherForecastService(IServiceProvider sp)
{
this.sp = sp;
}
public void Stop()
{
var ts = sp.GetService(typeof(TimedHostedService)) as TimedHostedService;
ts.StopAsync(new CancellationToken());
}
解决方案
我质疑从 GUI 操作服务的智慧,但如果你确定你想要这个,那么它就是关于如何注册该服务。
在启动时:
services.AddSingleton<TimedHostedService>();
services.AddHostedService(sp => sp.GetRequiredService<TimedHostedService>());
然后你可以
@inject TimedHostedService TimedService