Ninject vs Unity for DI [chiuso]


104

Stiamo usando ASP.net MVC.

Quale di questi è il miglior framework DI Ninject o Unity e perché?


94
NInject è migliore perché puoi acquistare fantastici magneti di marca dal loro sito web.
Ivan G.

5
Versione aggiornata di questa domanda (molto simile comunque) che alcune persone potrebbero trovare utile: stackoverflow.com/questions/4581791/…
Jason Down

Risposte:


46

L'ultima volta che ho guardato uno di loro ho trovato Ninject leggermente migliore. Ma entrambi hanno i loro svantaggi.

Ninject ha uno schema di configurazione fluente migliore. Unity sembra fare affidamento principalmente sulla configurazione XML. Lo svantaggio principale di Ninject è che richiede di fare riferimento a Ninject.Core ovunque nel codice per aggiungere attributi [Inject].

Se posso chiedere, perché stai limitando le tue scelte a questi due? Penso che Castle.Windsor, Autofac e StructureMap siano almeno altrettanto buoni o migliori.


47
Devi solo usare l'attributo Inject se c'è più di un costruttore e devi dire a Ninject quale costruttore usare. Per impostazione predefinita, utilizza il costruttore con il maggior numero di parametri.
Jeffrey Cameron,

11
Nel frattempo, c'è anche un'estensione ufficiale Ninject.Web.Mvc. Si modifica la MvcApplication in modo che derivi da NinjectHttpApplication, si avvia il kernel e si chiama RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) per fare in modo che si occupi di tutti i controller nell'assembly specificato. Magia.
Michael Stum

18
Questa risposta è ora piuttosto irrilevante con reagrd a Ninject 2. Mentre il reclamo era legittimo per Ninject 1, Ninject 2 consente di lavorare senza sporcare le classi con attributi. ninject2 funzionerà in modo trasparente senza la necessità di modificare le classi.
chillitom

3
Stessa cosa per l'unità in quanto sembra essere completamente configurabile tramite codice a questo punto (v3.0.1304.1)
Eric

46

So che questa è una vecchia domanda, ma ecco i miei pensieri:

Personalmente mi piace Ninject. Mi piacciono le interfacce fluide e l'eliminazione dell'XML. Generalmente mi piace XML, ma non per questo tipo di cose di configurazione. Soprattutto quando è coinvolto il refactoring, le interfacce fluenti ne facilitano la correzione.

Mi manca ObjectFactory di StructureMap, ma ci sono soluzioni alternative facili per aggiungerlo a Ninject.

Come sottolinea Jeffery, non è necessario utilizzare l'attributo [Inject] quando si dispone di un solo costruttore.

Ho scoperto che preferisco le interfacce fluenti non solo perché evitano XML, ma perché causano errori in fase di compilazione quando cambio qualcosa che le ha influenzate. La configurazione XML non lo fa e meno devo ricordarmi di cambiare meglio è.


10

Ninject rileva le dipendenze circolari se usi Injection Constructors al contrario di Unity che, indipendentemente dalla tecnica di injection, genera solo un'eccezione StackOverflowException che è estremamente difficile da eseguire il debug.


9

Sono d'accordo con Mendelt, non esiste un quadro DI "migliore". Dipende solo dalla situazione e tutti hanno pro e contro. pensa che David Hayden ha detto su DotNet Rocks che Unity è la scelta preferita se usi il resto di EntLib e hai familiarità con questo. Personalmente uso Unity perché al mio cliente piace il fatto che sia scritto Microsoft Enterprise Library (Unity) sulle DLL, se ottieni quello che sto dicendo.

Uso sia la configurazione xml per impostare le interfacce che le loro implementazioni concrete, ma poi utilizzo attributi nel codice durante l'iniezione, come:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

e nel codice:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

Personalmente penso che questo renda più chiaro cosa succede, ma ovviamente si potrebbe sostenere che avrai riferimenti all'unità in tutta la tua applicazione. Tocca a voi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.