Pregunta

¿Cómo puedo pasar argumentos a un constructor en un marco IOC? Quiero hacer algo como: (Intentar ser agnóstico de IOC-framework;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

Parece que esto no es posible en StructureMap. Pero me encantaría ver que alguien demuestre que estoy equivocado.

¿Hay otros marcos más ricos en funciones? ¿O estoy usando el IOC-framework de manera incorrecta?

¿Fue útil?

Solución

En el mapa de estructura puede lograr esto usando el método With:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

Ver: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity -objects-into-services.aspx

Otros consejos

Para Castle Windsor:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

observe el uso de un objeto anónimo para especificar argumentos de constructor.

usando StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();

¿Cómo puede ser esto independiente del lenguaje? Este es el detalle de implementación del marco en cuestión.

Spring te permite especificar c'tor args como una lista de valores / referencias, si eso es lo tuyo. Sin embargo, no es muy legible en comparación con la inyección de propiedades.

Algunas personas se calientan por esto e insisten en que la inyección de c'tor es el único enfoque seguro para hilos en Java. Técnicamente son correctos, pero en la práctica tiende a no importar.

No debería ser una necesidad muy común, pero a veces es válida. Ninject , que es más liviano que StructureMap, le permite pasar parámetros al recuperar objetos transitorios del contexto. Spring.NET también.

La mayoría de las veces, los objetos declarados en un contenedor de IoC no son transitorios, y aceptan otros objetos no transitorios a través de constructores / propiedades / métodos como dependencias.

Sin embargo, si realmente no quiere usar el contenedor como fábrica, y si tiene suficiente control sobre los objetos que desea resolver, puede usar la inyección de propiedades o métodos, incluso si suena menos natural y más riesgoso en de alguna manera.

Sí, otros marcos son más ricos en características: debe usar un marco ioc que permita la inyección del constructor. Spring es un ejemplo de un contenedor ioc en varios idiomas que permite la inyección de dependencia del constructor.

Otros marcos de IoC tienen más funciones.

I.e. consulte el ParameterResolution con Autofac

También puedes hacerlo fácilmente con Windsor

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top