2010-09-18 21 views
5

Soy bastante nuevo en Ninject, pero he logrado utilizarlo para DI mediante un proveedor personalizado.Ninject, proveedores y Activator.CreateInstance

La unión se inicializa como sigue

kernel = new StandardKernel(); 

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>(); 

y en el proveedor personalizado me llaman Activator.CreateInstance al igual que

protected override IPatientRecordLocator CreateInstance(IContext context) 
{ 
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"]; 
    var typeName = name.Split(',')[0]; 
    var assemblyName = name.Split(',')[1]; 
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator; 
} 

(sí, soy consciente de que no hay control de errores, etc. en el código anterior :))

y todo esto funciona como un encanto.

Ahora, el problema al que me enfrento es cuando introduzco una nueva clase que deseo inyectar en instancias de IPatientRecordLocator. El problema ocurre cuando agrego un constructor como el siguiente a, p. una de estas clases

[Inject] 
public MockPatientRecordLocator (IContactAdapter contactAdapter) 
{ 
    ... 
} 

Entonces, para Activator.CreateInstance para trabajar también tengo que añadir un constructor sin parámetros a MockPatientRecordLocator clase, es decir

public MockPatientRecordLocator() 
{ 
} 

Por lo tanto, mi pregunta es: ¿cómo puedo hacer Ninject Inyectar una instancia de una clase que implemente IContactAdapter en, por ejemplo MockPatientRecordLocator? Intenté inyectar el método, pero fue en vano.

que se olvidó de explicar que lo que estoy tratando de lograr es una especie de inyección encadenado en una instancia de la clase PatientRecordSummary se inyecta con una instancia de MockPatientRecordLocator (mediante la inyección de constructor) y dicha instancia de MockPatientRecordLocator debe conseguir inyectado con una instancia de IContactAdapter (de nuevo usando inyección de constructor (si es posible)). La primera parte de la cadena funciona, la segunda no.

Respuesta

1

¡No está mal para una primera pregunta!

Usted desea utilizar la sobrecarga de Bind(Type) para permitir el registro de cosas que usted no tiene forma estática disponible en el contexto de su código Load() - hacer las cosas que está haciendo en su proveedor (es decir, la resolución de la Type) por adelantado . Esto permitirá a Ninject hacer la instanciación del objeto (sin ningún requisito para un .ctor predeterminado)

IIRC two or 3 of my most recent answers también toca este material de descubrimiento/carga y tiene ejemplos que deberían ser relevantes para su caso.

(Y usted no necesita recurrir a [Inject] atributos cuando se ha llegado a quitar cosas)

+0

Hola Ruben, gracias por su ayuda (y complemento). Intentando lo mejor que puedo :-) En esta configuración en particular, no usé módulos, pero cambiaré a usarlos para poder usar Bind() más fácilmente. – norgie

Cuestiones relacionadas