asp.net mvc - Ninject vs Unity para DI
asp.net-mvc unity-container (5)
Estoy de acuerdo con Mendelt, no hay un "mejor" marco DI. Simplemente depende de la situación y todos tienen pros y contras. Creo que David Hayden dijo en DotNet Rocks que Unity es la opción preferida si usa el resto de EntLib y está familiarizado con eso. Yo personalmente uso Unity porque a mi cliente le gusta el hecho de que dice Microsoft Enterprise Library (Unity) en los archivos DLL, si entiendes lo que digo.
Utilizo ambas configuraciones xml para configurar las interfaces y sus implementaciones concretas, pero luego utilizo los atributos en el código al momento de la inyección, como:
<type type="ILogger" mapTo="EntLibLogger">
<lifetime type="singleton"/>
</type>
y en código:
[InjectionConstructor]
public Repository([Dependency] ILogger logger)
Personalmente, creo que eso aclara lo que sucede, pero, por supuesto, uno podría argumentar que tendrá referencias a la unidad en toda su aplicación. Tu decides.
Estamos usando ASP.net MVC.
¿Cuál de estos es el mejor marco de DI Ninject o Unity y por qué?
La última vez que miré a cualquiera de ellos encontré Ninject ligeramente mejor. Pero ambos tienen sus inconvenientes.
Ninject tiene un mejor esquema de configuración de fluencia. La unidad parece depender principalmente de la configuración XML. La principal desventaja de Ninject es que requiere que haga referencia a Ninject.Core en todas partes de su código para agregar atributos [Inject].
Si puedo preguntar, ¿por qué estás limitando tus elecciones a estos dos? Creo que Castle.Windsor, Autofac y StructureMap son al menos tan buenos o mejores.
Ninject detecta dependencias circulares si utiliza constructores de inyección en oposición a Unity que, independientemente de la técnica de inyección, solo lanza una Exception que es extremadamente difícil de depurar.
Sé que esta es una vieja pregunta, pero aquí están mis pensamientos:
Personalmente me gusta Ninject. Me gustan las interfaces fluidas y evitar XML. Generalmente me gusta XML, pero no para este tipo de cosas de configuración. Especialmente cuando se trata de refactorización, las interfaces fluidas lo hacen más fácil de corregir.
Extraño ObjectFactory de StructureMap, pero hay soluciones fáciles para agregar eso a Ninject.
Como señala Jeffery, no tienes que usar el atributo [Inject] cuando solo tienes un constructor.
Descubrí que prefiero las interfaces fluidas no solo porque evitan XML, sino también porque causan errores de tiempo de compilación cuando cambio algo que los afectó. La configuración XML no funciona y tengo menos que recordar cambiar lo mejor que estoy.
http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison
La unidad es más rápida, pero no es la mejor