2009-07-24 14 views
6

In iniezione di dipendenza di Ninject, se si imposta un legame di una classe a se stesso in questo modo:In Ninject, come posso eseguire codice personalizzato su un oggetto dopo che è stato creato con Bind <..> .ToSelf()?

Bind<SomeClass>().ToSelf(); 

Ninject molto bene risolve eventuali dipendenze SomeClass ha e ti dà l'oggetto indietro. Voglio essere in grado di fare qualcosa al SomeClass che restituisce ogni volta che ne crea uno nuovo, così come un evento di post-elaborazione. Potrei usare il binding .ToMethod (o ToFactoryMethod) per esplicitamente nuovo, ma vorrei che tutte le sue dipendenze fossero risolte da Ninject in anticipo.

E wouldu sarebbe bello fare qualcosa di simile:

Bind<SomeClass>() 
    .ToSelf() 
    .After(sc => sc.MethodIWantToCall()); // then after here, Ninject returns the object. 

C'è qualche modo per fare questo in Ninject 1.0/1.1?

+0

C'è un problema con l'esecuzione dell'attività che si desidera eseguire nel costruttore? –

+1

Suppongo che non ci sia nulla di sbagliato in questo e questa è la soluzione pratica :) Ma ho pensato che, forse, per test o forse alcuni scenari reali, il MethodIWantToCall() potrebbe essere considerato una parte dell'oggetto * activation *, che Sto andando su Ninject, piuttosto che sull'implementazione. Ma sono d'accordo che forse è un punto secondario. – ZeroBugBounce

risposta

11

Se non è possibile inserire il codice che si desidera eseguire nel costruttore, è possibile implementare IInitializable o IStartable. Il primo fornisce un metodo Initialize() che viene chiamato dopo che tutta l'iniezione è stata completata, e quest'ultimo fornisce sia un metodo Start() e Stop(), chiamato durante l'attivazione e la disattivazione, rispettivamente.

+2

Grazie! E grazie per Ninject :) – ZeroBugBounce

9

Mi sono imbattuto nello stesso problema, ma non ho potuto utilizzare la soluzione di Nate perché non riuscivo a realizzare il tipo IInitializable. Se siete in una barca simile, è possibile utilizzare .OnActivation ed evitare di dover modificare la definizione dei tipi di destinazione:

Bind<SomeClass>().ToSelf().OnActivation(x => ((SomeClass)x).MyInitialize()); 

Si può vedere come si chiama un metodo di inizializzazione arbitraria (MyInitialize) al momento dell'attivazione (esemplificazione) della classe.

Questo ha il vantaggio di non cuocere in una dipendenza dura a Ninject nelle proprie classi (a parte i moduli, ovviamente), consentendo così ai vostri tipi di rimanere agnostici sul DI-framework che si utilizza.

Problemi correlati