2010-11-17 23 views
9

Jak uzyskać jedność microsoft do "skonstruowania" listy klas dla danego typu interfejsu.Unity Rozwiązuj wiele klas

bardzo prosty przykład:

List<IShippingCalculation> list = new List<IShippingCalculation>(); 
    list.Add(new NewYorkShippingCalculation()); 
    list.Add(new FloridaShippingCalculation()); 
    list.Add(new AlaskShippingCalculation()); 

    //Not What I want 
    public void calcship(List<IShippingCalculation> list) 
    { 
    var info = new ShippingInfo(list); 
    info.CalculateShippingAmount(State.Alaska) 
    } 

    //Somehow in unity, must i do this for all the concrete classes? 
    //how does it know to give a list. 
    Container.RegisterType<IShippingInfo,new AlaskaShippingCalculation()>();?? 

    //What I want 
    public void calcship(IShippingInfo info) 
    { 
    info.CalculateShippingAmount(State.Alaska) 
    } 

Dziękuje!

Odpowiedz

13

Jeśli używasz Jedności 2 można użyć ResolveAll<T>

Container.RegisterType<IShippingInfo,FloridaShippingCalculation>("Florida"); 
Container.RegisterType<IShippingInfo,NewYorkShippingCalculation>("NewYork"); 
Container.RegisterType<IShippingInfo,AlaskaShippingCalculation>("Alaska"); 

IEnumerable<IShippingInfo> infos = Container.ResolveAll<IShippingInfo>(); 

Musisz nadać nazwę każdej rejestracji ponieważ ResolveAll powróci tylko nazwanych rejestracje.

+0

Jak to rozwiąże mój konstruktor? – dnndeveloper

+0

Wiedziałem, że istnieje ResolveAll, doh! – Aliostad

+0

Sądzę, że powinienem powiedzieć: Jak rozwiązać wszystkie problemy w moim konstruktorze? czy jest to coś, co będę musiał uzależnić od własności i jakoś rozwiązać w ten sposób. Dzięki! – dnndeveloper

10

Nie musisz mieć kontenera jako parametru, zarejestruj typy betonu z nazwami jak wspomniano powyżej, następnie w konstruktorze dodaj tablicę jako parametr, IList lub rodzajowy Enum nie działa.

public MyConstructor(IMyType[] myTypes) 
+0

Po prostu to zaznaczone - wszystkie zarejestrowane typy IMyType poprawnie trafiają do tablicy –

+0

Znalazłem to podejście o wiele łatwiejsze w zarządzaniu. Wszystko, co trzeba zrobić w pojemniku jest dodać 'Container.RegisterType , IMyType []>()' swoich klas w dół nie muszą wiedzieć, że używasz ramy DI, nie mówiąc już być narażone na szczegóły konkretnej struktury DI. – kiprainey

+0

Tak, aby mieć zależność od DI z klas domeny jest antipattern. To dlatego jest o wiele lepszą alternatywą – Anders