Wie registriere ich mehrere Implementierungen derselben Schnittstelle in Asp.Net Core?

Ich habe Dienste, die von derselben Schnittstelle abgeleitet sind

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

Typischerweise andere IOC-Container wieUnityit @ können Sie konkrete Implementierungen von einigen @ registriereKey das unterscheidet sie.

In Asp.Net Core, wie registriere ich diese Dienste und löse sie zur Laufzeit basierend auf einem Schlüssel auf?

Ich sehe keinAdd Servicemethode dauertkey odername Parameter, der normalerweise zur Unterscheidung der konkreten Implementierung verwendet wird.

    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
       }
    }

Ist das Factory-Muster hier die einzige Option?

Update1
Ich bin durch den Artikel gegangenHie zeigt, wie mit dem Factory-Muster Service-Instanzen abgerufen werden, wenn mehrere Concreate-Implementierungen vorliegen. Es ist jedoch noch keine vollständige Lösung. wenn ich @ anru_serviceProvider.GetService() -Methode Ich kann keine Daten in den Konstruktor einfügen. Betrachten Sie zum Beispiel dieses Beispiel

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;
    }
}

Wie kann_serviceProvider.GetService() passende Verbindungszeichenfolge einspeisen? In Unity oder einem anderen IOC können wir dies zum Zeitpunkt der Typregistrierung tun. Ich kann nutzen IOption Damit ich jedoch alle Einstellungen einspeisen kann, kann ich keine bestimmte Verbindungszeichenfolge in den Dienst einspeisen.

Beachten Sie auch, dass ich andere Container (einschließlich Unity) vermeiden möchte, da ich dann alles andere (z. B. Controller) auch bei neuen Containern registrieren muss.

Auch die Verwendung des Factory-Musters zum Erstellen einer Service-Instanz ist gegen DIP, da die Factory die Anzahl der Abhängigkeiten erhöht, von denen ein Client abhängig sein mussdetails hier

Also ich denke, die Standard-DI in ASP.NET-Kern fehlen 2 Dinge
1> Instanzen mit Schlüssel @ registrier
2> Statische Daten während der Registrierung in den Konstruktor einfügen

Antworten auf die Frage(26)

Ihre Antwort auf die Frage