2010-11-17 18 views
9

Comment obtenir l'unité microsoft pour «construire» une liste de classes pour un type d'interface donné.Unity résout plusieurs classes

exemple très simple:

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

Thankyou!

Répondre

13

Si vous utilisez l'unité 2 vous pouvez utiliser ResolveAll<T>

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

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

Vous devez donner un nom à chaque enregistrement, car ResolveAll ne retourne que les enregistrements nommés.

+0

Comment cela va résoudre dans mon constructeur? – dnndeveloper

+0

Je savais qu'il y a ResolveAll, doh! – Aliostad

+0

Je suppose que je devrais dire Comment faire une résolution tout dans mon constructeur? ou est-ce quelque chose que je vais devoir faire une dépendance à la propriété et faire une résolution de cette façon en quelque sorte. Merci! – dnndeveloper

10

Vous n'avez pas besoin du conteneur comme paramètre, enregistrez les types concrets avec des noms comme indiqué ci-dessus, puis dans le constructeur ajoutez un tableau en paramètre, IList ou Enum générique ne fonctionne pas.

public MyConstructor(IMyType[] myTypes) 
+0

Juste vérifié ceci - tous les types IMyType enregistrés sont correctement instanciés dans le tableau –

+0

J'ai trouvé ceci approche beaucoup plus facile à gérer. Tout ce que vous devez faire dans votre conteneur est ajouter 'Container.RegisterType , IMyType []>()' Vos classes en aval n'ont pas besoin de savoir que vous utilisez un cadre DI, sans parler de exposés aux détails d'un cadre particulier de DI. – kiprainey

+0

Oui pour avoir une dépendance à la DI des classes de domaine est un antipattern. C'est pourquoi c'est une bien meilleure alternative – Anders