2010-08-21 7 views
2

J'ai donc une situation dans laquelle je souhaite enregistrer n mappages d'un type de recherche particulier. IE:Enregistrement de plusieurs mappages du même type de recherche dans StructureMap pour l'injection du constructeur

x.For<IWidget>().Add<SquareWidget>(); 
x.For<IWidget>().Add<YellowWidget>(); 

Et je veux avoir SM injectent une dénombrable (ou tableau) d'entre eux dans le constructeur d'une classe:

public class Machine 
{ 
    public Machine(IEnumerable<IWidget> widgets) { ... } 
} 

ObjectFactory.GetInstance<Factory>() 

Je ne vois pas une façon de le faire, mais je Il se peut que je manque quelque chose.

TIA,

m

PS: S'il vous plaît ne répondez pas "pourquoi faites-vous cette façon" ou d'autres non commentaires pertinents. Je réalise que cela peut être accompli en utilisant d'autres approches. Je suis vraiment juste curieux si cette approche particulière est possible. :)

Répondre

7

Avec les versions plus récentes de StructureMap (qui reconnaissent IEnumerable), il devrait fonctionner exactement comme vous l'avez dans la question. Enregistrez simplement plusieurs types concrets en utilisant For(). Add(), puis placez un IEnumerable du type d'interface en tant que paramètre constructeur. StructureMap injectera automatiquement tous les types de béton enregistrés. Pas besoin d'utiliser un code d'enregistrement spécifique comme TheArrayOf ...

+0

Joshua, tout à fait raison, merci. Quand j'ai essayé de le faire, j'ai rencontré une erreur que je n'arrivais pas à résoudre. Je suis juste retourné et ai essayé encore et ai réalisé sur moi que j'avais une surcharge de constructeur qui a pris IWidget et un autre qui a pris IEnumerable . SM essayait d'injecter dans le constructeur qui prenait IWidget mais comme il y en avait deux enregistrés, et aucun n'était défini par défaut, SM ne savait pas lequel injecter dans ce constructeur particulier. J'ai donc enlevé le constructeur qui a pris IWidget et j'étais doré. Ici, le problème était entre la chaise et le clavier ...;) – hcoverlambda

3

Si vous aviez un tableau d'IWidgets dans le constructeur, alors SM ajouterait tous les IWidgets lorsque vous créez une machine, car je crois que c'est le comportement par défaut.

Pour injecter un tableau spécifique:

For<IMachine>() 
    .TheDefault.Is.OfConcreteType<Machine>() 
    .TheArrayOf<IWidget>().Contains(
      x => { 
       x.OfConcreteType<SquareWidget>(); 
       x.OfConcreteType<YellowWidget>(); 
       x.OfConcreteType<BadWidget>(); 
      }); 

ou, pour un IEnumerable:

For<IMachine>() 
    .TheDefault.Is.OfConcreteType<Machine>() 
    .CtorDependency<IEnumerable<IMachine>>().Is(i => { 
     i.Is.ConstructedBy(c => { 
      return new List<ITask> { 
       x.OfConcreteType<SquareWidget>(); 
       x.OfConcreteType<YellowWidget>(); 
       x.OfConcreteType<BadWidget>(); 
       }; 
      }); 
    }); 

Il y a probablement un moyen de faire ce dernier sans avoir à être précis, mais mes billons esprit. :)

Oh, et la magie d'injection serait également possible.

+0

alphadogg, parfait. Le premier exemple m'a indiqué dans la bonne direction. Merci! – hcoverlambda