dependency injection - Indicando a StructureMap que use otro Constructor
dependency-injection inversion-of-control (3)
Cuando se utiliza un contenedor DI como structuremap, es mejor tener solo un constructor en cada clase. Este constructor tiene que resolver todas las dependencias de la clase, si IMyService
es una dependencia (aunque parece algo extraño), esto siempre se debe resolver al crear instancias para que el constructor sin parámetros no sea necesario.
Tengo una clase con 2 constructores.
Mi clase()
y
MyClass (servicio IMyService)
¿Cómo le digo a StructureMap que cada vez que hago una ''nueva MyClass ()'' en realidad debería llamar al segundo constructor y no al primer constructor.
Por favor ayuda.
Si llama a new MyClass()
, entonces StructureMap no está involucrado en absoluto. Ninguna cantidad de configuración de StructureMap cambiará el comportamiento.
Si llama a ObjectFactory.GetInstance<MyClass>()
, StructureMap llamará de manera predeterminada al constructor con más parámetros.
Si desea que StructureMap use un constructor diferente, puede especificar el constructor (a través de la respuesta de PHeiberg):
x.SelectConstructor<IMyClass>(() => new MyClass(null));
O simplemente puede decirle a StructureMap explícitamente cómo crear la instancia usando la sobrecarga de Use()
que acepta un Func<>
:
x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
La respuesta de Joshua cubre todos los aspectos. Como nota al margen para configurar Structuremap para elegir un constructor específico sin hardcoding los argumentos al constructor como se hizo en el ejemplo de Joshua, puedes usar el método SelectContructor:
x.SelectConstructor<MyService>(() => new MyService());
La lambda en la llamada al método SelectConstructor debe invocar el constructor necesario (poner nulls o cualquier valor del tipo correcto para todos los parámetros presentes). Consulte la documentación para obtener más información.