Ich habe Dienste, die von derselben Schnittstelle abgeleitet sind.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
In der Regel können Sie mit anderen IoC-Containern Unity
konkrete Implementierungen von einigen registrieren Key
, die sie unterscheiden.
Wie registriere ich diese Dienste in ASP.NET Core und löse sie zur Laufzeit basierend auf einem Schlüssel auf?
Ich sehe keine Add
Service-Methoden, die einen key
oder name
Parameter annehmen , die normalerweise zur Unterscheidung der konkreten Implementierung verwendet werden.
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
Ist das Factory-Muster hier die einzige Option?
Update1
Ich habe den Artikel hier durchgesehen , der zeigt, wie das Factory-Muster verwendet wird, um Service-Instanzen abzurufen, wenn wir mehrere konkrete Implementierungen haben. Es ist jedoch immer noch keine vollständige Lösung. Wenn ich die _serviceProvider.GetService()
Methode aufrufe, kann ich keine Daten in den Konstruktor einfügen.
Betrachten Sie zum Beispiel Folgendes:
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()
die entsprechende Verbindungszeichenfolge eingefügt werden? In Unity oder einer anderen IoC-Bibliothek können wir dies bei der Typregistrierung tun. Ich kann jedoch IOption verwenden , für die ich alle Einstellungen vornehmen muss. Ich kann keine bestimmte Verbindungszeichenfolge in den Dienst einfügen.
Beachten Sie auch, dass ich versuche, die Verwendung anderer Container (einschließlich Unity) zu vermeiden, da ich dann auch alles andere (z. B. Controller) beim neuen Container registrieren muss.
Die Verwendung des Factory-Musters zum Erstellen von Dienstinstanzen ist außerdem gegen DIP gerichtet, da dadurch die Anzahl der Abhängigkeiten erhöht wird, über die ein Client hier Details verfügt .
Ich denke, der Standard-DI in ASP.NET Core fehlen zwei Dinge:
- Die Möglichkeit, Instanzen mithilfe eines Schlüssels zu registrieren
- Die Möglichkeit, statische Daten während der Registrierung in Konstruktoren einzufügen
Update1
zu einer anderen Frage verschoben werden, da das Injizieren von Dingen in Konstruktoren sich stark von der Ermittlung des zu konstruierenden Objekts unterscheidet