В версии 2.2, с которой вы работали, в основном случайно. Всякий раз, когда вы регистрируете несколько реализаций для службы, последняя из них является «выигравшей». Например, возьмите следующий код:
services.AddSingleton<IHostedService, HostedService1>();
services.AddSingleton<IHostedService, HostedService2>();
// ...
public IndexModel(IHostedServie hostedService) { }
Реализация IHostedService
, которая вводится в IndexModel
, является HostedService2
;последний зарегистрированный. Если бы IndexModel
было обновлено до IEnumerable<IHostedService>
, оно получило бы обе реализации в порядке регистрации:
public IndexModel(IEnumerable<IHostedService> hostedServices) { }
Когда я сказал "случайно", яозначает, что в вашем примере only HostedServices.MyService
регистрируется, поэтому он также является последним зарегистрированным и, следовательно, он "выигрывает".
В 3.0 при использовании Generic Host , реализация IHostedService
, GenericWebHostService
, обрабатывает веб-запросы. Это создает проблему, поскольку GenericWebHostService
зарегистрировано после HostedServices.MyService
. Я надеюсь, что к настоящему времени ясно, что именно по этой причине IHostedService
, который вы запрашиваете в IndexModel
, не соответствует ожидаемому.
С точки зрения решения, я предлагаю выполнить две регистрации:
services.AddSingleton<HostedServices.MyService>();
services.AddHostedService(sp => sp.GetRequiredService<HostedServices.MyService>());
Затем обновите IndexModel
, чтобы он требовал вашей конкретной реализации:
public IndexModel(HostedServices.MyService myService) { }
Это позволит вам настроить вашу конкретную реализацию на IHostedService
. Он регистрируется дважды для двух разных типов сервисов, но создается только один экземпляр.