Несколько рабочих в основных сервисах .net? - PullRequest
1 голос
/ 04 октября 2019

Шаблон рабочих сервисов dot net core 3.0, показанный ниже:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices(services =>
            {
                services.AddHostedService<Worker>();
            });
}

Класс "Рабочий" является производным от BackgroundService. Он зацикливается на записи журнала в консоль каждые 1000 мс.

Мои вопросы:

Могу ли я запустить несколько "рабочих" одновременно? (Я знаю, что могу создать другой класс «Worker2». Но могу ли я запустить две копии одного и того же класса «Worker»?)

Если да, как я могу настроить два «Worker» с другой конфигурацией или параметрами, скажемдвух рабочих с разными интервалами зацикливания? (Потому что экземпляр класса «Рабочий» создается DI-фреймворком. Я не знаю, как передать разные конфигурации / параметры двум различным экземплярам «Рабочий»)

1 Ответ

0 голосов
/ 09 октября 2019

Причина, по которой «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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...