Причина, по которой «AddHostedService» не принимает тот же класс, зарегистрированный дважды:
Я проверил источник github «AddHostedService» и обнаружил, что он реализован следующим образом:
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, THostedService>());
Согласно документации Microsoft о методе «TryAddEnumerable», служба добавляется только в том случае, если в коллекции нет другой регистрации для того же сервиса и типа реализации. Это причина, почему я не могу запустить две копии «Работника». («TryAddEnumerable» используется намеренно, чтобы избежать создания нескольких экземпляров для одной и той же службы. Ref: https://github.com/aspnet/Extensions/issues/1078)
Решение:
Таким образом, я могу добавить дваработники, использующие "AddSingleton" напрямую ...
services.AddSingleton<IHostedService, Worker>();
services.AddSingleton<IHostedService, Worker>();
Работает.
Передача параметра в конструктор службы:
Затем я изменил конструктор класса Worker, добавив второй параметр для интервала цикла.В заключение я использую фабрику реализации при регистрации службы следующим образом:
services.AddSingleton<IHostedService>(sp => new Worker(sp.GetService<ILogger<Worker>>(), 1000));
services.AddSingleton<IHostedService>(sp => new Worker(sp.GetService<ILogger<Worker>>(), 2000));