2010-11-03 13 views
5

Ho una classe che deve utilizzare un IRepository per un metodo nella sua classe.Come si utilizza l'iniezione del metodo con Ninject?

Idealmente, vorrei evitare di dover risolvere questa dipendenza nel costruttore della classe, quindi ho trovato l'iniezione a livello di metodo in Ninject e mi chiedevo come funziona?

Capisco come configurarlo. Quello di cui sono confuso è come chiamarlo?

Esempio:

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

mio problema è come faccio a chiamare questo metodo senza specificare un IRepository?

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

funzionerebbe se stavo usando il costruttore, ma voglio chiamare un metodo.

Come si chiama un metodo utilizzando l'iniezione del metodo Ninject?

risposta

12

Temo che l'iniezione di metodo non funzioni in questo modo - è solo uno dei modi per iniettare le dipendenze in un oggetto durante la sua costruzione (è possibile iniettare le dipendenze attraverso i parametri del costruttore, attraverso proprietà, campi o metodi). iniezione metodo è utile se la classe prende le sue dipendenze da metodi setter in stile Java come

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

Se è contrassegnato con l'attributo [Inject], non c'è bisogno di chiamare direttamente questo metodo, è di essere chiamato da Ninject durante l'inizializzazione per passare l'oggetto IRepository nell'oggetto risolto.

Quindi credo che il tuo metodo QueryForSomeStuff venga chiamato quando si resove il tuo SomeClassThatUsesRepository.

+0

+1 ottima spiegazione. Vorrei solo ricordare che simula la costruzione in due fasi, ad esempio, come se il metodo fosse chiamato Initialize() –

0

Confermato che l'iniezione del metodo non funziona come previsto. Hai una classe di attributi MVC personalizzata e volevo utilizzare un oggetto iniettato al suo interno. Non passarlo al costruttore e il metodo aggiunto

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

Questo metodo non è mai stato chiamato e ConfigHelper era nulla quando OnActionExecuting dell'attributo è stato chiamato.

Problemi correlati