2011-01-12 9 views
7

Soy nuevo en StructureMap y tengo algún código con el que estoy trabajando que utilice StructureMap 2.5.4.StructureMap e inyección IEnumerable <T>

Hay una clase que se construye utilizando StructureMap que tiene un constructor que toma IEnumerable<ICar> como parámetro.

El registro tiene el siguiente código.

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

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

Estoy escribiendo una unidad de prueba y han obtenido un contenedor anidado de la ObjectFactory y se ha inyectado una instancia utilizando el método Inject. Una de las instancias de ICar debe recibir el tipo inyectado en su constructor. Sin embargo, no funcionaba y rastreé eso hasta la llamada a ObjectFactory.GetAllInstances() que no usa mi contenedor anidado.

¿Cómo puedo hacer que funcione?

También leí sobre las matrices de autoenlace de StructureMap y las instancias de IEnumerable, pero no pude hacerlo funcionar.

¿Existe alguna forma mejor de reescribir el código de registro anterior para que se cree una instancia de IEnumerable<ICar> y use el tipo inyectado de mi contenedor anidado?

+0

En algunos lugares usa 'TCar' y otros usa' ICar'. ¿Cuál es su relación (y StructureMap sabe acerca de su relación)? –

+0

Lo siento, son lo mismo .. typo. – GiddyUpHorsey

Respuesta

7

Si está inyectando una instancia en un contenedor anidado, deberá recuperar esa instancia del contenedor anidado. La ObjectFactory estática tiene su propio contenedor, probablemente el contenedor 'principal' en su caso. El contenedor primario no hereda instancias de contenedores anidados.

No necesita hacer ningún registro específico para tener todas las instancias inyectadas en una clase que acepta IEnumerable en su constructor. StructureMap lo hará automáticamente. Si tiene 3 instancias de ICar registradas en su contenedor, y solicita una instancia de Foo desde ese contenedor, donde Foo tiene un parámetro constructor IEnumerable<ICar>, Foo se creará con las 3 instancias de ICar inyectadas.

+0

Sí, me imaginé que ObjectFactory tiene su propio contenedor y para que el tipo inyectado no fuera visible para la llamada 'ObjectFactory.GetAllInstances ()', solo necesito saber cómo reescribir esa línea de código para que la inyección tipo es visible. – GiddyUpHorsey

+0

Intenté eliminar 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());' línea pero obtengo la siguiente excepción: 'Código de excepción de StructureMap: 202 No se definió ninguna instancia predeterminada para PluginFamily IEnumerable '. Por lo que dijo, pensé que la línea 'x.AddAllTypesOf ();' habría registrado todas las instancias de ICar y que el parámetro IEnumerable se suministraría al constructor del tipo solicitado. ¿Alguna idea de por qué eso no funciona del todo bien? – GiddyUpHorsey

+0

Ok, tengo esto funcionando. Tuve que actualizar el proyecto para usar la última versión de StructureMap. La versión 2.5.4 no se comporta de la manera descrita, pero 2.6.1 sí lo hace. También eliminé la línea 'ForRequestedType >(). TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());' y pude obtener la instancia inyectada de mi contenedor anidado. – GiddyUpHorsey

Cuestiones relacionadas