2010-11-03 14 views
5

Tengo una clase que necesita usar un IRepository para un método en su clase.¿Cómo se usa el método de inyección con Ninject?

Idealmente, me gustaría evitar tener que resolver esta dependencia en el constructor de la clase, así que encontré la inyección de nivel de método en Ninject y me preguntaba cómo funciona esto?

Entiendo cómo configurarlo. Lo que estoy confundido es cómo llamarlo?

Ejemplo:

class SomeClassThatUsesRepository 
{ 
    [Inject] 
    public void QueryForSomeStuff(IRepository repository) 
    { 
     //do some stuff 
    } 
} 

Mi problema es ¿cómo puedo llamar a este método sin especificar una IRepository?

var someClass = Kernel.Resolve<SomeClassThatUsesRepository>(); 

funcionaría si yo estaba usando el constructor, pero quiero llamar a un método.

¿Cómo llamo a un método usando inyección de método Ninject?

Respuesta

12

Me temo que la inyección de métodos no funciona de esta manera; es solo una de las maneras de inyectar dependencias en un objeto durante su construcción (puede inyectar sus dependencias mediante parámetros de constructor, mediante propiedades, campos o métodos). inyección método es útil si su clase tiene sus dependencias mediante métodos setter de estilo de Java como

public void SetRepository(IRepository repository) { ... } 

Si está marcado con [Inject] atributo, no es necesario llamar directamente a estos métodos, es ser llamado por Ninject durante la inicialización para pasar el objeto IRepository a su objeto resuelto.

Creo que se está llamando a su método QueryForSomeStuff cuando resuelva su SomeClassThatUsesRepository.

+0

+1 gran explicación. Solo mencionaría que imita la construcción de dos fases, es decir, como si el método se llamara Initialize() –

0

Confirmado que la inyección de método no funciona como se esperaba. Obtuve una clase de atributo MVC personalizada y quería usar un objeto inyectado dentro de ella. No pasarlo en el constructor y el método agregado

[Ninject.Inject] 
public void ResolveDI(ISettingStore store) 
{ 
    ConfigHelper = store; 
} 

Este método nunca fue y ConfigHelper era nula cuando OnActionExecuting del atributo se llama.

Cuestiones relacionadas