Зарегистрируйте несколько синглетонов с одинаковым интерфейсом, но разными значениями параметров конструктора - PullRequest
0 голосов
/ 20 апреля 2020

Я застрял и мне нужен совет или указатель на решение.

Веб-API с ASP. NET Core 3.1

Startup.cs

services.AddSingleton<ITopicClient>(s => new TopicClient({connectionstring},{topic}));

TopicRepository.cs

 public class TopicRepository : ITopicRepository
 {
        private readonly ITopicClient _topicClient1;
       private readonly ITopicClient _topicClient2;

        public TopicRepository (ITopicClient topicClient1, ITopicClient topicClient2)
        {         
            _topicClient1 = topicClient1;
            _topicClient2 = topicClient2;
        }
        public async Task<Response> SendToTopicAsync(string message, string topic)
        {
           if( topic == "topic1")
           await _topicClient1.send(message);
           else if (topic == "topic2")
           await _topicClient2.send(message);
        }
}

TopicClient.cs в общей библиотеке

        public TopicClient(string serviceBusConnectionString, string topicName)
        {
           _topicClient = new TopicClient(_serviceBusConnectionString,topicName);
        }

Мне нужно отправить сообщение на разные темы. Я хотел бы зарегистрировать сервисы с разными именами topi c в файле startup.cs. Я хочу повторно использовать тему клиентского соединения.

services.AddSingleton (s => new TopicClient ({connectionstring}, { topic1 }));

services.AddSingleton (s => new TopicClient ({connectionstring }, { topic2 }));

Как этого добиться, регистрируя экземпляры одного типа одного типа с использованием одного интерфейса?

Заранее спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Уже можно зарегистрировать несколько экземпляров в качестве одного и того же интерфейса, поэтому, когда вы делаете:

services.AddSingleton<ITopicClient>(_ => new TopicClient("topic1"));
services.AddSingleton<ITopicClient>(_ => new TopicClient("topic2"));

, вы уже добавили два экземпляра в контейнер.

Только когда вы разрешаете интерфейс ITopicClient, вы всегда получаете последний добавленный экземпляр. Например, если вы разрешите:

// instance = topic2
var instance = container.GetService<ITopicClient>();

Если вам нужны все экземпляры, вы должны разрешить / ввести IEnumerable<ITopicClient>.

class TopicRepository
{
    public TopicRepository(IEnumerable<ITopicClient> clients)
    {
        // clients contains topic1 and topic2
    }
}
...