2013-07-26 5 views
9

Gibt es eine Möglichkeit, eine einzelne Schnittstelle zu registrieren, die mit mehr als einer konkreten Klasse unter Verwendung von [Simple-Injector] und ohne Verwendung der Template-Schnittstelle implementiert wird?Mehrere Implementierungen mit einer einzigen Schnittstelle registrieren

sagen, wir haben zwei Klassen MyClass1 und Myclass2 und diese beiden Klassen implementieren IInterface1

Jetzt mit [simple-Injektor] wir diese

container.Register<IInterface1, Myclass1>(); 
container.Register<IInterface1, Myclass2>(); 

Umwandlung vorhandene Schnittstelle zu Template-Schnittstelle nicht in der Lage zu tun, waren ist ein harter Job auf der bestehenden Codebasis. Hoffentlich gibt es da etwas einfacher.

Antwort

12

Sie können mit der Verwendung der RegisterCollection Methode mehrere Implementierung der gleichen Schnittstelle registrieren (siehe documentation: eine Sammlung von Instanzen konfigurieren werden zurückgegeben)

So müssen Sie schreiben:

container.RegisterCollection<IInterface1>(new[] { typeof(Myclass1), typeof(Myclass2) }); 

Und jetzt Simple Injector kann eine Sammlung von Interface1 Implementierungen in Ihren Konstruktor einspeisen, zum Beispiel:

public class Foo 
{ 
    public Foo(IEnumerable<IInterface1> interfaces) 
    { 
     //... 
    } 
} 

Oder Sie können Ihre IInterface1 Implementierungen mit GetAllInstances explizit lösen:

var myClasses = container.GetAllInstances<IInterface1>(); 
+0

Problem SimpleInjector wird, nachdem mehrere Implementierungen für eine Schnittstelle registriert, gibt es keine Möglichkeit, die der registrierten Fälle angeben, sollten für eine bestimmte Schnittstelle zurückgeschickt werden. In Ihrem Beispiel können Sie nicht angeben, dass eine Instanz der Klasse Myclass2 zurückgegeben wird, wenn Sie nach IInterface1 gefragt werden. Andere IoC-Container wie Ninject ermöglichen es, jede Registrierung für den gleichen Dienst (Schnittstelle) zu "benennen", so dass Sie später bei der Lösungszeit eine Unterscheidung treffen können. – Lester

+2

@Lester: Wenn Sie dies benötigen, vergewissern Sie sich, dass Sie das [Liskow-Substitutionsprinzip] (https://en.wikipedia.org/wiki/Liskov_substitution_principle) nicht verletzen, wenn Sie dies benötigen. Wie auch immer, hier finden Sie weitere Informationen zur Verwendung der [Registrierung mit Schlüsseleingabe in Simple Injector] (https://simpleinjector.readthedocs.org/en/latest/howto.html#resolve-instances-by-key). – Steven

+1

@nemesv was ist, wenn wir eine Implementierung zu einer Zeit benötigen, z.B. Shoper-Klassenkonstruktor hat ICreditCard-Schnittstelle. Und 2 Klassen MasterCard und VisaCard implementieren ICreditCard. Shoper braucht eine Klasse auf einmal. Wie verwende ich IOC in diesem Szenario? –