У меня также есть диспетчер очередей, созданный как одноэлементный, который позволяет мне получать базу производителей/потребителей на основе конфигурации очереди, также передаваемой в конфигурации IOptions.
Я передаю разные служебные ключи для каждой версии конвейера, который хочу создать.
Простая версия моего кода (сокращенная до ниже только основы)
Код: Выделить всё
public IServiceCollection AddPipelineService(this IServiceCollection services,
IConfigurationManager configuration, string serviceKey)
{
// Get Config for the steps based on the sevice key
var StepOptions = Options.Create(
configuration
.GetSection($"{serviceKey}:{StepOptions.StepOptionsName}")
.Get());
// Build a list of steps and reister a service
services.AddKeyedSingleton(serviceKey, (p,o) => new Step1(p.GetRequiredService(), stepOptions);
services.AddKeyedSingleton(serviceKey, (p, o) => new Step2(p.GetRequiredService(), stepOptions);
services.AddKeyedSingleton(serviceKey, (p, o) => new Step3(p.GetRequiredService(), stepOptions);
// Create the service provider
var provider = services.BuildServiceProvider(validateScopes: true);
// Add the steps to a set collection
IEnumerable steps = provider.GetKeyedServices(serviceKey);
services.AddKeyedSingleton(serviceKey, (p, o) => new StepCollection(steps));
// Create the queue options based on the service key
var queueOptions = Options.Create(
configuration
.GetSection($"{serviceKey}:{QueueOptions.QueueOptionsName}")
.Get());
// NOTE
// IQueueManager registered earlier as a singleton (i only want to onpen a siingle connection and reuse for creation of consumers and producers)
// PipelineBackgroundService is a BackgroundService
services.AddSingleton(
p => new PipelineBackgroundService(
p.GetRequiredService(),
p.GetRequiredService(),
p.GetRequiredKeyedService(serviceKey),
queueOptions);
return services;
}
Есть ли способ сделать это без этого побочного эффекта и без использования BuildServiceProvider.
Спасибо,
Ник
Подробнее здесь: https://stackoverflow.com/questions/786 ... ceprovider