2009-06-28 19 views
94

Estamos utilizando ASP.net MVC.Ninject vs Unity para DI

Cuál de estos es el mejor marco DI Ninject o Unity y por qué?

+94

NInject es mejor porque puedes comprar imanes geniales de su sitio web. –

+5

Versión actualizada de esta pregunta (muy similar de todos modos) que algunas personas pueden encontrarle útil: http: // stackoverflow.com/questions/4581791/which-c-di-ioc-framework-is-best –

Respuesta

43

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 me permite la pregunta, ¿por qué estás limitando sus opciones a estos dos? Creo que Castle.Windsor, Autofac y StructureMap son al menos tan buenos o mejores.

+46

Solo necesita usar el atributo Inject si hay más de un constructor y necesita decirle a Ninject qué constructor usar. Por defecto usa el constructor con la mayor cantidad de parámetros. –

+11

Mientras tanto, también hay una extensión oficial Ninject.Web.Mvc. Cambia su aplicación Mvc para derivar de NinjectHttpApplication, gira el Kernel en ella y llama a RegisterAllControllersIn (Assembly.GetExecutingAssembly()) para que se ocupe de todos los controladores en el ensamblaje dado. Magia. –

+18

Esta respuesta ahora es bastante irrelevante con respecto a Ninject 2. Mientras que la queja era legítima para Ninject 1, Ninject 2 permite trabajar sin tirar allí las clases con atributos. ninject2 operará de manera transparente sin la necesidad de modificar tus clases. – chillitom

9

Estoy de acuerdo con Mendelt, no existe un marco DI "mejor". 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 las DLL, si entiendes lo que digo.

Puedo utilizar tanto la configuración XML para configurar las interfaces y sus implementaciones concretas pero entonces utilizar atributos en el código cuando se inyecta, como:

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

y en el 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.

45

Sé que esto 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 de agregar para Ninject.

Como Jeffery señala que no tiene que usar el atributo [Inyectar] cuando solo tiene 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 y menos tengo que recordar para cambiar lo mejor que estoy.

10

Ninject detecta dependencias circulares si utiliza constructores de inyección en lugar de la unidad que, independientemente de la técnica de inyección simplemente lanza una StackOverflowException que es extremadamente difícil de depurar.