9

Tengo una clase con 2 constructores.Diciendo a StructureMap que use otro constructor

MiClase()

y

MiClase (servicio IMyService)

¿Cómo le digo StructureMap continuación, cada vez que hago un 'new MyClass()' que en realidad debería llamar el segundo constructor y no se el primer constructor

Por favor ayuda.

Respuesta

20

Si llama al new MyClass(), entonces StructureMap no está involucrado en absoluto. Ninguna cantidad de configuración de StructureMap cambiará el comportamiento.

Si llama al ObjectFactory.GetInstance<MyClass>(), StructureMap llamará por defecto al constructor con más parámetros.

Si desea StructureMap utilizar un constructor diferente, puede especificar el constructor (a través de la respuesta de PHeiberg):

x.SelectConstructor<IMyClass>(() => new MyClass(null)); 

O puede simplemente decirle StructureMap explícitamente cómo crear la instancia utilizando la sobrecarga de Use() que acepta un Func<>:

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>())) 
+0

¿Qué sucede si quiero utilizar un constructor MyClass que tenga 2 parámetros? 'ctx.GetInstance <>' solo permite 1 tipo de parámetro. –

5

respuesta de Joshua está cubriendo todos los aspectos. Como nota al margen con el fin de configurar StructureMap para elegir un constructor específico sin codificar los argumentos para el constructor como se hizo en el ejemplo de Josué puede utilizar el método SelectContructor:

x.SelectConstructor<MyService>(() => new MyService()); 

La lambda en la llamada al método SelectConstructor debería invocar el constructor necesario (poner nulls o cualquier valor del tipo correcto para todos los parámetros presentes). Ver the documentation para más información.

0

Al usar 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 (que a pesar de todo se ve un poco extraña) esto siempre se debe resolver al crear instancias para que el constructor sin parámetros no sea necesario.

+0

Lo siento, lo he corregido ahora. En lugar de CMyService, tengo el usuario CMyClass. Gracias. –

Cuestiones relacionadas