2013-07-26 17 views
9

Czy istnieje sposób zarejestrowania pojedynczego interfejsu, który jest implementowany przez więcej niż jedną klasę betonu za pomocą [prostego wtryskiwacza] i bez korzystania z interfejsu szablonu?Rejestrowanie wielu implementacji za pomocą pojedynczego interfejsu

powiedzieć, mamy 2 lekcje MyClass1 i Myclass2 i obie te klasy realizują IInterface1

Teraz za pomocą [prosty wtryskiwacz] nie byliśmy w stanie to zrobić

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

konwersji istniejącego interfejsu do interfejsu szablonu jest ciężką pracą w istniejącym kodzie źródłowym. Mam nadzieję, że tam jest trochę łatwiej.

Odpowiedz

12

Możesz zarejestrować wiele realizacji tego samego interfejsu z zastosowaniem metody RegisterCollection (patrz documentation: Konfiguracja kolekcję przypadkach zostać zwrócone)

Więc trzeba napisać:

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

a teraz Simple Injector może wstrzyknąć kolekcję implementacji Interface1 do swojego konstruktora, na przykład:

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

Albo można jednoznacznie rozwiązać swoje implementacje IInterface1 z GetAllInstances:

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

problem z SimpleInjector jest po rejestracji wielu implementacji dla jednego interfejsu, nie ma sposobu, aby określić, które z zarejestrowanych przypadków powinny być zwrócone do danego interfejsu. W swojej próbce nie można określić, aby zwracać instancję klasy Myclass2 podczas pytania o interfejs IInterface1. Inne kontenery IoC, takie jak Ninject, pozwalają "nazwać" każdą rejestrację dla tej samej usługi (interfejsu), dzięki czemu można je później rozróżnić w czasie rozwiązania problemu. – Lester

+2

@Lester: Jeśli potrzebujesz tego, upewnij się, że nie naruszasz [zasady Liskov Substitution Principle] (https://en.wikipedia.org/wiki/Liskov_substitution_principle), jeśli tego potrzebujesz. Ale tak czy siak, oto więcej informacji o używaniu [rejestracja z kluczem w Simple Injector] (https://simpleinjector.readthedocs.org/en/latest/howto.html#resolve-instances-by-key). – Steven

+1

@ co, jeśli potrzebujemy jednej implementacji na raz, np. Konstruktor klasy Shoper ma interfejs ICreditCard. A także 2 klasy MasterCard i VisaCard wdrażają ICreditCard. Shoper potrzebuje jednej klasy na raz. Jak korzystać z IOC w tym scenariuszu? –

Powiązane problemy