2013-06-04 7 views
39

Qualcuno può dirmi se riesco a registrare un'istanza già creata di una classe con Ninject in modo che utilizzi questa istanza ogni volta che deve essere iniettata?Nascosto: registrare un'istanza già creata con Ninject?

Suppongo che tu possa chiamarlo singleton ma ho già creato l'istanza. Tutta la documentazione punta alla creazione di nuove istanze di una classe.

+0

.InSingletonScope() è quello che stai dopo. Crea una singola istanza e la inserisce in tutto ciò che ne ha bisogno, perché è così che scorre. –

+3

Grazie, ma InSingleScope crea l'istanza, ho già l'istanza, è stata inizializzata con alcune proprietà .... quindi ho bisogno di registrare quell'istanza specifica ... Hai un esempio? – Martin

+0

Ricorda, dovresti creare un grafico delle dipendenze, non dovresti creare nuovi oggetti, il contenitore dovrebbe conoscerli tutti prima che l'applicazione sia in esecuzione, quindi se stai facendo il backup di oggetti e poi vuoi in qualche modo farli riferimento in qualche modo altra area della tua applicazione, che assomiglia ad una sorta di anti-pattern come Service Locator, in cui dovresti afferrare istanze dal Kernel ovunque. A meno che non stia fraintendendo qualcosa, scusa se lo sono :) –

risposta

57

È possibile utilizzare il metodo ToConstant che accetta un'istanza già esistente e lo registra come singleton.

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToConstant(myClassInstance); 

Se si desidera qualcosa di più complesso è possibile utilizzare il ToMethod (dove è possibile utilizzare un Func per ottenere il vostro esempio) in combinazione con il InSingletonScope

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToMethod(context => myClassInstance).InSingletonScope(); 
+1

Bello, in quali situazioni qualcuno potrebbe legare un'istanza che non era già stata creata in alcuni NinjectModule? Sembra un po 'strano per me, a meno che le associazioni non possano essere eseguite per qualche motivo all'inizio dell'applicazione e potrebbero richiedere alcuni trucchi fatti altrove. Mai usato. ToConstant, sembra utile per le situazioni difficili :) –

+0

Ciao patrick, ho un'istanza di un oggetto che mi è stato dato da un componente di terze parti all'avvio dell'applicazione, questa istanza è popolata con proprietà, se ho appena acquisito questo oggetto o aveva un modulo ninject, ma anche se fosse un singleton, non avrei tutte le proprietà corrette. Ma sono aperto a dare consigli. Attualmente sto passando il mio oggetto a un costruttore di un modulo ninject che ho creato e che usa ninject per registrare di istanza come per nemesv. – Martin

+2

Questo dovrebbe risolvere il tuo problema dato che Martin ti ha dato un buon esempio di come passare già attraverso il tuo oggetto istanziato :) –