Как зарегистрировать несколько реализаций одного и того же интерфейса в Asp.Net Core?

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

public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { } 
public class ServiceC : IService { }

Как правило, другие контейнеры МОК, такие какUnity позволяют регистрировать конкретные реализации некоторымиKey это отличает их.

В Asp.Net Core, как мне зарегистрировать эти сервисы и разрешить их во время выполнения, основываясь на каком-то ключе?

Я не вижу ни одного изAdd Сервисный метод занимаетkey или жеname параметр, который обычно используется для различения конкретной реализации.

    public void ConfigureServices(IServiceCollection services)
    {            
         // How do I register services here of the same interface            
    }


    public MyController:Controller
    {
       public void DoSomeThing(string key)
       { 
          // How do get service based on key
       }
    }

Шаблон фабрики - единственный вариант здесь?

Update1
Я прошел через статьюВот это показывает, как использовать фабричный шаблон для получения экземпляров сервисов, когда у нас есть множественная конкретная реализация. Однако это все еще не полное решение. когда я звоню_serviceProvider.GetService() метод я не могу ввести данные в конструктор. Например, рассмотрим этот пример

public class ServiceA : IService
{
     private string _efConnectionString;
     ServiceA(string efconnectionString)
     {
       _efConnecttionString = efConnectionString;
     } 
}

public class ServiceB : IService
{    
   private string _mongoConnectionString;
   public ServiceB(string mongoConnectionString)
   {
      _mongoConnectionString = mongoConnectionString;
   }
}

public class ServiceC : IService
{    
    private string _someOtherConnectionString
    public ServiceC(string someOtherConnectionString)
    {
      _someOtherConnectionString = someOtherConnectionString;
    }
}

Как может_serviceProvider.GetService() ввести соответствующую строку подключения? В Unity или любом другом МОК мы можем сделать это во время регистрации типа. я могу использоватьIOption однако для этого потребуется ввести все параметры, я не могу добавить конкретную строку подключения в службу.

Также обратите внимание, что я стараюсь избегать использования других контейнеров (включая Unity), потому что тогда я должен зарегистрировать все остальное (например, контроллеры) с новым контейнером.

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

Поэтому я думаю, что по умолчанию DI в ядре ASP.NET не хватает 2 вещей
1> Зарегистрировать экземпляры с помощью ключа
2> Внедрить статические данные в конструктор при регистрации

Ответы на вопрос(13)

Ваш ответ на вопрос