Почему мой HomeController не создается при регистрации IHostedService - PullRequest
0 голосов
/ 12 ноября 2019

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

Подводя итог, я пытаюсь:1) зарегистрируйтесь как singleton, один из моих сервисов, который запускается оболочкой IHostedService2) чтобы мой HomeController был запущен при запуске приложения с использованием вышеуказанной службы

Я начал со следующего и безуспешно пытался использовать разные его версии:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSingleton<IRunnerA, RunnerA>();
    services.AddSingleton<IRunnable>
    (
        services => services.GetRequiredService<IRunnerA>()
        // services => services.GetService<IRunnerA>() does not work either
    );

    services.AddSingleton<IHostedService, RunnableWrapper>(); // the IHostedService wrapper
}

Хотя RunnableWrapper запускается при запуске приложения (т. Е. Вызывается его StartAsync), мой экземпляр HomeController ниже никогда не создается:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private IRunnerA _runnerA;

    public HomeController
    (
        ILogger<HomeController> logger,
        IRunnerA runnerA
    )
    {
        // Never reaches here while debugging, given the above services config.
    }

Вопрос: Почему нет? t * HomeController получает экземпляр?

===

Дополнительная информация: Среди множества попыток я также попробовал то, что было предложено здесь: https://stackoverflow.com/a/52398431,, но у меня все еще такое же поведение.

Наблюдения:

  1. Как ни странно, если я уберу строку services.AddSingleton<IHostedService, RunnableWrapper>();, мой HomeController будет создан при запуске приложения.
  2. Если я вернусь из моего RunnableWrapper метода public async Task StartAsync(CancellationToken cancellationToken) без выполнения длительной операции внутри него (который, как я думал, был весь смысл фоновой службы), мой HomeController будет создан.

1 Ответ

0 голосов
/ 12 ноября 2019

Кажется, что проблема заключается в запуске долго выполняющейся задачи в IHostedService, когда она зарегистрирована внутри ConfigureServices в Startup. По какой-то причине он блокируется ApplicationStarted.

. В соответствии с этим разделом https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.0&tabs=visual-studio#ihostedservice-interface, я удалил строку services.AddSingleton<IHostedService, RunnableWrapper>(); и обновил CreateHostBuilder до следующего:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<RunnableWrapper>();
    });

Теперь все работает как положено.

Я не уверен, почему StartAsync в IHostedService вызывается до запуска приложения по умолчанию;если у него долгое задание, кажется, что оно блокируется.

...