2011-01-12 9 views
7

Ich bin neu in StructureMap und habe einige vorhandenen Code, mit denen ich arbeite, die StructureMap 2.5.4 verwendet.StructureMap und IEnumerable injizieren <T>

Es gibt eine Klasse, die mit Hilfe von StructureMap erstellt wird und einen Konstruktor hat, der IEnumerable<ICar> als Parameter akzeptiert.

Die Registrierung hat den folgenden Code.

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

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

Ich schreibe ein Gerät zu testen und haben eine geschachtelte Behälter aus dem Object erhalten und haben eine Instanz mit dem Einspritzverfahren eingespritzt. Eine der Instanzen von ICar sollte den injizierten Typ in seinem Konstruktor erhalten. Es funktionierte jedoch nicht und ich verfolgte das bis zum ObjectFactory.GetAllInstances() - Aufruf, der meinen verschachtelten Container nicht verwendet.

Wie kann ich das zum Funktionieren bringen?

Ich las auch über StructureMap Autowiring-Arrays und IEnumerable-Instanzen, aber ich konnte es nicht zum Laufen bringen.

Gibt es eine bessere Möglichkeit, den obigen Registrierungscode neu zu schreiben, so dass eine Instanz von IEnumerable<ICar> erstellt wird und den injizierten Typ aus meinem verschachtelten Container verwenden?

+0

An einigen Stellen verwenden Sie "TCar" und andere verwenden Sie "ICar". Was ist ihre Beziehung (und weiß StructureMap über ihre Beziehung)? –

+0

Sorry, sie sind das gleiche .. Tippfehler. – GiddyUpHorsey

Antwort

7

Wenn Sie eine Instanz in einen verschachtelten Container injizieren, müssen Sie diese Instanz aus dem verschachtelten Container abrufen. Die statische ObjectFactory hat einen eigenen Container, in Ihrem Fall den übergeordneten Container. Der übergeordnete Container erbt keine Instanzen aus verschachtelten Containern.

Sie müssen keine spezielle Registrierung durchführen, um alle Instanzen in eine Klasse zu injizieren, die in ihrem Konstruktor IEnumerable akzeptiert. StructureMap wird das automatisch tun. Wenn Sie 3 Instanzen von ICar in Ihrem Container registriert haben und eine Instanz von Foo von diesem Container anfordern, wobei Foo einen IEnumerable<ICar> Konstruktorparameter hat, wird Foo mit den 3 injizierten ICar-Instanzen erstellt.

+0

Ja, ich dachte, dass die ObjectFactory einen eigenen Container hat, und damit der injizierte Typ für den Aufruf von ObjectFactory.GetAllInstances () nicht sichtbar ist, muss ich nur wissen, wie man diese Codezeile so umschreibt, dass sie injiziert wird Typ ist sichtbar. – GiddyUpHorsey

+0

Ich habe versucht, die 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ()); Linie, aber ich bekomme die folgende Ausnahme:' StructureMap-Ausnahmecode: 202 keine Standard-Instanz definiert für PluginFamily IEnumerable '. Von dem, was Sie sagten, dachte ich, dass die 'x.AddAllTypesOf ();' Zeile alle Instanzen von ICar registriert hätte und dass der IEnumerable Parameter an den Konstruktor des angeforderten Typs geliefert werden würde. Irgendeine Idee, warum das nicht ganz richtig funktioniert? – GiddyUpHorsey

+0

Ok, ich habe das funktioniert. Ich musste das Projekt aktualisieren, um die neueste Version von StructureMap zu verwenden. Version 2.5.4 verhält sich nicht wie beschrieben, 2.6.1 jedoch. Ich entfernte auch die 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ()); Zeile und war in der Lage, die injizierte Instanz von meinem verschachtelten Container zu bekommen. – GiddyUpHorsey

Verwandte Themen