Несколько экземпляров синглтона при использовании BuildServiceProviderC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Несколько экземпляров синглтона при использовании BuildServiceProvider

Сообщение Anonymous »

Я пытаюсь создать службу конвейера внедрения зависимостей, которая работает как фоновая служба. Идея состоит в том, что я могу создать от одного до многих этих сервисов и передать простую конфигурацию IOption для некоторых значений, которые необходимо изменять на каждом этапе (загружаемых с использованием служебного ключа), я регистрирую их с помощью ключей сервиса. поэтому они не перезаписывают друг друга.
У меня также есть диспетчер очередей, созданный как одноэлементный, который позволяет мне получать базу производителей/потребителей на основе конфигурации очереди, также передаваемой в конфигурации 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, который, как мне кажется, создает новый контейнер. Но я прочитал, что мне следует избегать использования BuildServiceProvider
Есть ли способ сделать это без этого побочного эффекта и без использования BuildServiceProvider.
Спасибо,
Ник

Подробнее здесь: https://stackoverflow.com/questions/786 ... ceprovider
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»