Stiamo usando ASP.net MVC.
Quale di questi è il miglior framework DI Ninject o Unity e perché?
Stiamo usando ASP.net MVC.
Quale di questi è il miglior framework DI Ninject o Unity e perché?
Risposte:
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.
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 è.
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.
http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison
L'unità è più veloce ma non è la migliore