Estamos utilizando ASP.net MVC.
¿Cuál de estos es el mejor marco de DI Ninject o Unity y por qué?
Estamos utilizando ASP.net MVC.
¿Cuál de estos es el mejor marco de DI Ninject o Unity y por qué?
Respuestas:
La última vez que miré a cualquiera de ellos encontré a Ninject un poco mejor. Pero ambos tienen sus inconvenientes.
Ninject tiene un mejor esquema de configuración fluida. Unity parece depender principalmente de la configuración XML. El principal inconveniente de Ninject es que requiere que hagas referencia a Ninject.Core en todas partes de tu código para agregar atributos [Inject].
Si puedo preguntar, ¿por qué limita sus opciones a estos dos? Creo que Castle.Windsor, Autofac y StructureMap son al menos tan buenos o mejores.
Sé que esta es una pregunta antigua, 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 facilitan la corrección.
Echo de menos ObjectFactory de StructureMap, pero hay soluciones fáciles para agregar eso a Ninject.
Como señala Jeffery, no es necesario utilizar el atributo [Inject] cuando solo tiene un constructor.
Descubrí que prefiero las interfaces fluidas no solo porque evitan XML, sino porque causan errores en el tiempo de compilación cuando cambio algo que las afecta. La configuración XML no lo hace y cuanto menos tengo que recordar cambiar, mejor estoy.
Estoy de acuerdo con Mendelt, no existe un marco de DI "mejor". 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 las DLL, si entiendes lo que estoy diciendo.
Utilizo tanto la configuración xml para configurar las interfaces como sus implementaciones concretas, pero luego uso atributos en el código al inyectar, como:
<type type="ILogger" mapTo="EntLibLogger">
<lifetime type="singleton"/>
</type>
y en código:
[InjectionConstructor]
public Repository([Dependency] ILogger logger)
Personalmente, creo que eso deja más claro lo que sucede, pero, por supuesto, se podría argumentar que tendrá referencias a la unidad en toda su aplicación. Tu decides.
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