Blazor: Как получить экземпляр размещенного сервиса? - PullRequest
1 голос
/ 05 октября 2019

Я добавил фоновый сервис, который периодически что-то делает, например, официальный образец.

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

TimedHostedService имеет StartAsync и StopAsync. В конечном счете, я хочу вызвать их в веб-браузере.

В файле FetchData.razor в стандартных лесах я пытался ссылаться на эту службу напрямую, но это не сработало. Итак, я добавил Start и Stop метод к WeatherForecastService и вызвал их для события click.

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

Теперь проблема в том, что я не знаю, как получитьзапуск экземпляра TimedHostedService в методе Stop WeatherForecastService.

public class WeatherForecastService
{
....
    public void Stop()
    {
        //how to get TimedHostedService instance?
    }
....
}

Я пытался использовать внедрение зависимостей для получения поставщика услуг, но GetService вернул ноль.

IServiceProvider sp;
public WeatherForecastService(IServiceProvider sp)
{
    this.sp = sp;
}

public void Stop()
{
    var ts = sp.GetService(typeof(TimedHostedService)) as TimedHostedService;
    ts.StopAsync(new CancellationToken());
}

1 Ответ

1 голос
/ 06 октября 2019

Я подвергаю сомнению целесообразность манипулирования сервисом из графического интерфейса, но если вы уверены, что хотите этого, то речь идет о том, как зарегистрировать этот сервис.

При запуске:

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

и тогда вы можете

@inject TimedHostedService TimedService
...