首页 > 解决方案 > Blazor:如何获取托管服务实例?

问题描述

我添加了一个后台服务,它会定期做一些事情,比如官方示例。

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

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

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

<button @onclick="()=> { ForecastService.Stop(); }">Stop</button>

现在,问题是,我不知道如何TimedHostedServiceStop.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());
}

标签: asp.net-coreblazorblazor-server-side

解决方案


我质疑从 GUI 操作服务的智慧,但如果你确定你想要这个,那么它就是关于如何注册该服务。

在启动时:

services.AddSingleton<TimedHostedService>();
services.AddHostedService(sp => sp.GetRequiredService<TimedHostedService>());

然后你可以

@inject TimedHostedService TimedService

推荐阅读