Blazor:如何获取托管服务实例?

Dam*_*les 3 asp.net-core blazor blazor-server-side

我添加了一个定期执行某些操作的后台服务,例如官方示例。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddHostedService<TimedHostedService>(); <-- here
    services.AddSingleton<WeatherForecastService>();
}
Run Code Online (Sandbox Code Playgroud)

TimedHostedService有和。最终,我想在网络浏览器中调用这些。StartAsyncStopAsync

FetchData.razor默认脚手架的文件中,我尝试直接引用该服务,但这不起作用。因此,我添加了StartStop方法WeatherForecastService并在单击事件上调用它们。

<button @onclick="()=> { ForecastService.Stop(); }">Stop</button>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我不知道如何TimedHostedServiceStop的方法中获取 的运行实例WeatherForecastService

public class WeatherForecastService
{
....
    public void Stop()
    {
        //how to get TimedHostedService instance?
    }
....
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用依赖注入来获取服务提供者,但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());
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 7

我质疑从 GUI 操作服务是否明智,但如果您确定需要这样做,那么问题就在于如何注册该服务。

启动时:

services.AddSingleton<TimedHostedService>();
services.AddHostedService(sp => sp.GetRequiredService<TimedHostedService>());
Run Code Online (Sandbox Code Playgroud)

然后你就可以

@inject TimedHostedService TimedService
Run Code Online (Sandbox Code Playgroud)