Код: Выделить всё
class MyBackgroundService : BackgroundService
{
// ...
Dictionary _workers
public MyBackgroundService(/*a bunch of injected dependencies*/)
{
// store the injected dependencies in private fields
}
protected override Task ExecuteAsync(CancellationToken token)
{
while (true)
{
if (_myWatcher.GetNewConfigurations(out var newConfigurations)
{
foreach (var newConfiguration in newConfigurations)
{
_workers[newConfiguration.Id] = new MyWorker(/*pass in all the injected private fields*/);
}
}
// some code to remove workers that are no longer needed from the dictionary
// some code to break out of the loop when appropriate
}
}
// ...
}
Код: Выделить всё
MyBackgroundServiceКод: Выделить всё
class MyBackgroundService : BackgroundService
{
// ...
Dictionary _workers
private readonly IServiceProvider _serviceProvider;
public MyBackgroundService(IServiceProvider sp)
{
_serviceProvider = sp;
}
protected override Task ExecuteAsync(CancellationToken token)
{
while (true)
{
if (_myWatcher.GetNewConfigurations(out var newConfigurations)
{
foreach (var newConfiguration in newConfigurations)
{
_workers[newConfiguration.Id] = _serviceProvider.GetService();
}
}
// some code to remove workers that are no longer needed from the dictionary
// some code to break out of the loop when appropriate
}
}
// ...
}
Другой очевидный вариант — это фабричный шаблон, в котором я добавляю MyWorkerFactory в MyBackgroundService, но это своего рода просто шаг вперед, когда вместо MyBackgroundService принимает кучу зависимостей, которые он не использует, вместо этого это делает MyWorkerFactory.
Сначала я думал, что простое внедрение класса MyWorker как переходного решит проблему, пока не понял, что Transient создает новый экземпляр для каждого экземпляра, который его запрашивает, но поскольку MyBackgroundService является одноэлементным, все равно будет только один MyWorker.
Как правильно это сделать?
Подробнее здесь: https://stackoverflow.com/questions/791 ... t-multiple
Мобильная версия