2009-11-04 22 views
9

Sto creando una piccola applicazione C#, che attualmente consiste in un assembly principale e un assembly winforms. Mi rendo conto che probabilmente non ho davvero bisogno di Ninject in una piccola cosa come questa, ma mi piacerebbe provarlo.C#, Ninject: dove inserisci il kernel e i tuoi moduli?

In ogni caso, per lavorare con Ninject ho capito che si scriverebbe un insieme di moduli, che le mappe vengono restituite e così via. Dopodiché dovrai creare un'istanza di IKernel e caricare i tuoi moduli in quello.

Ma, dove tengo quei moduli? E dove tengo il kernel? Dove vanno le cose?

risposta

3

È possibile creare una classe wrapper statica per il kernel. In questo modo puoi fare qualcosa come ServiceLocator.Resolve()

Per la registrazione dei servizi ci sono due modi: registrazione in linea e modulo. Entrambi dovrebbero essere caricati all'avvio. Il modulo è migliore per l'organizzazione.

Forse sarebbe più semplice iniziare con StructureMap perché esiste una classe statica e ha funzionalità di mappatura automatica.

Quei screencast dovrebbe farti partire:

3

+ 1'd risposta di Marek - sicuramente guardare attraverso tali risorse.

Alcuni punti ...

Sei sicuramente giusto per provare questo, anche in una piccola applicazione. È anche importante riflettere su domande superficialmente semplici come quella che hai posto. Per DI, devi davvero lavorare con esso per apprezzarlo davvero - io per primo ero nel campo "Oh, ho solo una piccola app" (negazione) per molto tempo finché non l'ho usato .

C'è una scuola in cui quella in generale dovrebbe allontanarsi dall'indicatore di posizione e solo dopo l'iniezione [senza alcuna dipendenza da un contenitore].

Se non si utilizzano i Service Locator, nessuno deve sapere dove si trova il Container (Kernel), che è la cosa migliore.

I moduli sono principalmente allo scopo di compartimentare lotti di elementi da registrare in un particolare contenitore generale (kernel).

Sicuramente c'è un'attuazione canonica "Global Container" Singleton disponibile per Ninject? EDIT: trovato una: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

Vedi anche Ninject: How do I inject into a class library?

+0

Stavo solo cercando un modo canonico per fare questo e ho pensato "fantastico!" quando ti ho visto collegato. Cattive notizie, quel codice è TERRIFICAMENTE SICURO. Se dovessi racchiudere il kernel in un singleton, potrei farlo io stesso in un modo sicuro (suggerimento, costruttore statico) ma saremo avvisati di tutti quelli che verranno qui in futuro: l'articolo che collega è un'implementazione completamente non thread-safe. –

+0

@JimmyHoffa Sono d'accordo sul fatto che non sia sicuro (suggerire di applicare un approccio a tua scelta da http://csharpindepth.com/articles/general/singleton.aspx). Tuttavia, molto meglio di questo è andare con il punto principale della mia risposta, che è avere una radice di composizione che ha un luogo chiaro dove può avvenire l'inizializzazione per prendere la necessità di questo thread di sicurezza (tra gli altri problemi) fuori dalla foto completamente. –

+0

Non ho familiarità con la root della composizione, ma senza accesso al kernel come si richiedono gli oggetti da cui si desidera iniettare il costruttore? nella tua interfaccia utente desideri accedere al tuo 'UserManager' che prende un' IUserRepository' alla costruzione; come si ottiene 'UserManager' senza accesso al kernel (attraverso qualcosa come un localizzatore di servizi)? Non puoi semplicemente "nuovo UserManager (???);" e aspettarti che la cosa giusta sia consegnata al suo costruttore, vero? –

0

mio punto di vista: come ha detto Marek, è necessario creare un po 'di involucro (probabilmente statico) per il kernel, che contiene l'istanza Ikernel. Dovrebbe contenere il metodo Resolve < T> e probabilmente il metodo Load (modulo INinjectModule) - tutto statico.

In ciascun assieme, è possibile semplicemente definire il proprio INinjectModule che associa le classi all'interno di questo assieme.

Il kernel wrapper è nel 'basso', il gruppo più comune (in genere quella dove registro e Utils sono). È perché il kernel deve essere accessibile da tutte le parti, quindi deve essere nell'assembly, a cui fanno riferimento tutti gli altri. Se non ne hai uno, sei sempre abbastanza libero per crearne uno. Questo potrebbe sembrare un po 'complicato, ci si potrebbe aspettare che il kernel sia nell'assemblaggio' più alto '(quello eseguibile). Non vero.

per registrare tutti i moduli dalle vostre assemblee, è sufficiente chiamare Kernel.Load (nuova XXModule) in ciascuno di essi.

Problemi correlati