2009-10-29 25 views
8

Uso il filtro Dipendenza nel mio codice (con Ninject) e ho pensato che stavo andando abbastanza bene fino a quando non ho riscontrato un problema di prestazioni causato da un fraintendimento dei contenitori DI nel codice. Sembra che ci siano molte informazioni su come usare i framework DI ma non troppo su dove non usarli o sul modo migliore di usarli (almeno quello che potrei trovare)Best practice dell'iniezione delle dipendenze

Ho pensato di scrivere quello che ho pensavo fossero delle buone pratiche e vedevo se altre persone erano d'accordo con me e quali altre migliori pratiche le persone possono trovare.

  • Usa un kernel per ogni applicazione o AppDomain
  • Usare il contenitore DI per longevo Singleton solo oggetti, utilizzare le fabbriche (o altri metodi) per gli oggetti transitori di breve durata)
  • Preferisco Constructor iniezione sulla proprietà o Campana iniezione
  • Richiesta oggetti, non costruire loro
  • altri ?? puntatori a buoni blog/articoli ??
+0

cosa c'è kernel? è un concetto specifico di Ninject (non l'ho visto da nessun'altra parte)? – zvolkov

+0

inoltre, il setter vs iniezioni costruttore è un argomento religioso e come tale deve essere evitato. – zvolkov

risposta

7

Ecco un breve elenco dei punti più importanti (alcuni dei quali appaiono anche nel PO):

  • codice dovrebbe essere a conoscenza di quali DI Container (se presente) viene utilizzato
  • Compose l'intera applicazione nella radice dell'applicazione (la radice Composizione)
  • favore Constructor iniezione

non posso dire che sono d'accordo con il punto sugli oggetti Singleton vs. Transient. Il punto di DI è che un meccanismo esterno (come ad esempio un contenitore DI) determina il tempo di vita di un dato di dipendenza, non qualcun altro, quindi è necessario avere tutte le dipendenze gestiti dal DI Container.

+0

Ciao Marco, vedere la discussione qui (http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8) sulle prestazioni di Ninject nelle applicazioni. Come te, ho pensato che il contenitore DI dovrebbe essere usato ovunque ma il sovraccarico dei contenitori DI è tale che la creazione di un gran numero di oggetti transitori può essere invadente. Il tuo consiglio è ottimo per le applicazioni web forse, ma non così tanto in altri domini. –

+0

Ho sfogliato quella discussione, ma penso di essere d'accordo con Nate lì. DI dovrebbe essere utilizzato per risolvere e iniettare le dipendenze, ma se si creano centinaia di migliaia di oggetti attraverso un contenitore DI, c'è qualcosa di sbagliato nella progettazione generale. Non è mai stata l'intenzione di DI. Ho potuto aggiungere un altro punto di proiettile alla mia lista: "favore disaccoppiamento Dipendenze volatili oltre Dipendenze stabile", ma è più una raccomandazione disegno generale di una cosa particolare DI. –

+2

Accetto gli oggetti transitori: la maggior parte delle applicazioni che usano DI creano un grande numero di oggetti transitori. Alcuni contenitori (Unity e presto Autofac 2) sono impostati su transient anziché su Singleton. Non credo che "preferire singleton" possa essere considerato una best practice - sembra più un commento sulle prestazioni di un contenitore specifico in uno scenario specifico. –

4

Utilizzare il contenitore DI per longeva Singleton oggetti solo, uso fabbriche (o altri metodi) per gli oggetti transitori di breve durata)

Ma lasciare libero DI iniettare fabbriche in cui vi serve .