Мне нужно добавить несколько экземпляров одного и того же класса в DI следующим образом.
программа.cs
using PruebaWorkerService1;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>( x => new Worker("worker1"));
builder.Services.AddHostedService<Worker>(x => new Worker("worker2"));
builder.Services.AddHostedService<Worker>(x => new Worker("worker3"));
var host = builder.Build();
host.Run();
Рабочий.cs
namespace PruebaWorkerService1;
public class Worker : BackgroundService{
private readonly string _msg;
public Worker(string msg){
this._msg = msg;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken){
while (!stoppingToken. IsCancellationRequested){
Console.WriteLine(("Worker running at: {time} {msg}", DateTimeOffset.Now, _msg));
await Task.Delay(1000, stoppingToken);
}
}
Результат:
Результат Был создан экземпляр только Worker1. Я думал, что с разными аргументами (msg) будут созданы разные экземпляры. Что мне нужно сделать, чтобы создать более одного экземпляра службы?





AddHostedService добавит только первую услугу для типа, последующие регистрации будут игнорироваться (внутренне используется TryAddEnumerable). У вас есть следующие варианты:
Добавьте тип потомка в соответствии с настройкой и зарегистрируйте его, а не Worker
Используйте хакерский подход с ручной регистрацией через дескриптор:
builder.Services.Add(ServiceDescriptor.Singleton<IHostedService>(_ => new Worker("worker1")));
builder.Services.Add(ServiceDescriptor.Singleton<IHostedService>(_ => new Worker("worker2")));
builder.Services.Add(ServiceDescriptor.Singleton<IHostedService>(_ => new Worker("worker3")));
Обработайте настройки в работнике, например создайте поток/задачу для каждого параметра и запустите их ExecuteAsync (например, посмотрите этот ответ)
@marianodesivo 1) да, вы можете 2) найдите «захват C# для переменной цикла» (решение — ввести временную переменную var temp = i; ... Worker(temp.ToString())))
Спасибо. Вариант 2: А как насчет циклов? Могу ли я использовать, например, цикл For для динамического добавления рабочих? Я пробовал:
for (int i = 0; i < 10; i++) builder.Services.Add(ServiceDescriptor.Singleton<IHostedService>(_ => new Worker(i.ToString())));Но при i = 10 сервис прибавляется только в 10 раз.