Я чесал голову, пытаясь заставить это работать, но ничего, что я пытаюсь сделать, похоже, не получается.
Подводя итог, я пытаюсь:1) зарегистрируйтесь как singleton, один из моих сервисов, который запускается оболочкой IHostedService
2) чтобы мой 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,, но у меня все еще такое же поведение.
Наблюдения:
- Как ни странно, если я уберу строку
services.AddSingleton<IHostedService, RunnableWrapper>();
, мой HomeController
будет создан при запуске приложения. - Если я вернусь из моего
RunnableWrapper
метода public async Task StartAsync(CancellationToken cancellationToken)
без выполнения длительной операции внутри него (который, как я думал, был весь смысл фоновой службы), мой HomeController
будет создан.