2010-11-17 21 views
9

Come ottengo microsoft unity per 'costruire' un elenco di classi per un dato tipo di interfaccia.Unity Resolve Multiple Classes

esempio molto semplice:

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

Grazie!

risposta

13

Se si utilizza l'unità 2 è possibile utilizzare ResolveAll<T>

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

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

Devi dare un nome ad ogni registrazione, in quanto ResolveAll restituisce solo le registrazioni di nome.

+0

Come si risolverà nel mio costruttore? – dnndeveloper

+0

Sapevo che c'è Resolve All, doh! – Aliostad

+0

Credo che dovrei dire Come faccio a risolvere tutto nel mio costruttore? o è qualcosa che dovrò fare una dipendenza dalla proprietà e fare qualcosa di risoluto in questo modo. Grazie! – dnndeveloper

10

Non è necessario avere il contenitore come parametro, registrare i tipi di calcestruzzo con i nomi come detto sopra, quindi nel costruttore aggiungere un array come parametro, IList o Enum generico non funziona.

public MyConstructor(IMyType[] myTypes) 
+0

Appena verificato questo - tutti i tipi di IMyType registrati vengono istanziati nell'array –

+0

Ho trovato questo approccio molto più facile da gestire. Tutto quello che dovete fare nel vostro contenitore è aggiungere 'Container.RegisterType , IMyType []>()' Le classi a valle non hanno bisogno di sapere che si sta utilizzando un quadro DI, per non parlare di essere esposto ai dettagli di un particolare framework DI. – kiprainey

+0

Sì per avere dipendenza dal DI dalle classi di dominio è un antipattern. Ecco perché questa è un'alternativa molto migliore – Anders