2011-01-12 14 views
7

Sono nuovo in StructureMap e ho un codice esistente con cui sto lavorando con StructureMap 2.5.4.StructureMap e iniezione di IEnumerable <T>

C'è una classe che viene costruita utilizzando StructureMap che ha un costruttore che prende come parametro IEnumerable<ICar>.

Il registro ha il seguente codice.

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.WithDefaultConventions(); 
    x.AddAllTypesOf<ICar>(); 
    } 
); 

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
      x => ObjectFactory.GetAllInstances<ICar>()); 

sto crei una prova di unità e hanno ottenuto un contenitore nidificata fuori ObjectFactory e hanno iniettato un'istanza utilizzando il metodo Iniettare. Una delle istanze di ICar dovrebbe ricevere il tipo iniettato nel suo costruttore. Tuttavia non funzionava e l'ho rintracciato fino alla chiamata ObjectFactory.GetAllInstances() che non utilizza il mio contenitore nidificato.

Come posso farlo funzionare?

Ho anche letto sugli array autowiring StructureMap e sulle istanze IEnumerable ma non sono riuscito a farlo funzionare.

Esiste un modo migliore per riscrivere il codice di registro sopra in modo che venga creata un'istanza di IEnumerable<ICar> e che utilizzi il tipo immesso dal mio contenitore nidificato?

+0

In alcuni posti si usa 'TCar' e altri si usa' ICar'. Qual è la loro relazione (e StructureMap sa della loro relazione)? –

+0

Siamo spiacenti, sono la stessa cosa ... errore di battitura. – GiddyUpHorsey

risposta

7

Se si sta iniettando un'istanza in un contenitore nidificato, sarà necessario recuperare tale istanza dal contenitore nidificato. ObjectFactory statico ha il proprio contenitore, probabilmente il contenitore "genitore" nel tuo caso. Il contenitore padre non eredita le istanze dai contenitori nidificati.

Non è necessario eseguire alcuna registrazione specifica per inserire tutte le istanze in una classe che accetta uno IEnumerable nel suo costruttore. StructureMap lo farà automaticamente. Se hai 3 istanze di ICar registrate nel tuo contenitore e richiedi un'istanza di Foo da quel contenitore, dove Foo ha un parametro di costruttore IEnumerable<ICar>, Foo verrà creato con le 3 istanze di ICar iniettate.

+0

Sì, ho capito che ObjectFactory ha il proprio contenitore e quindi il tipo iniettato non era visibile alla chiamata 'ObjectFactory.GetAllInstances ()', ho solo bisogno di sapere come riscrivere quella riga di codice in modo che l'iniettato il tipo è visibile. – GiddyUpHorsey

+0

Ho provato a rimuovere 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());' line ma ottengo la seguente eccezione: 'StructureMap Exception Code: 202 Nessuna istanza predefinita definita per PluginFamily IEnumerable '. Da quello che hai detto, ho pensato che la riga 'x.AddAllTypesOf ();' avrebbe registrato tutte le istanze di ICar e che il parametro IEnumerable sarebbe stato fornito al costruttore del tipo richiesto. Qualche idea sul perché non funzioni perfettamente? – GiddyUpHorsey

+0

Ok, ho capito. Ho dovuto aggiornare il progetto per usare l'ultima versione di StructureMap. La versione 2.5.4 non si comporta come descritto, ma 2.6.1. Ho anche rimosso 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());' line ed è stato in grado di ottenere l'istanza iniettata dal mio contenitore annidato. – GiddyUpHorsey

Problemi correlati