¿Qué framework de Inyección de Dependencias de .NET merece la pena investigar?

¿Qué marcos de dependency injections de C # / .NET valen la pena investigar? Y qué puedes decir sobre su complejidad y velocidad.

editar (no por el autor): hay una lista completa de marcos de trabajo de IoC disponible en https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Castle Windsor – Castle Windsor es el mejor contenedor de Inversión de Control disponible para .NET y Silverlight.
  • Unity – Contenedor de dependency injections extensible y liviano con soporte para la inyección de llamada de constructor, propiedad y método
  • Autofac : un adictivo contenedor IOC de .NET
  • DryIoc : simple, rápido, todo el contenedor IoC con todas las funciones.
  • Ninject – El ninja de los inyectores de dependencia .NET
  • StructureMap – El contenedor IoC / DI original para .Net
  • Spring.Net – Spring.NET es un marco de aplicación de código abierto que facilita la creación de aplicaciones enterprise .NET
  • LightInject – Un contenedor de IoC ultraligero
  • Inyector simple : Simple Injector es una biblioteca de dependency injections (DI) fácil de usar para .NET 4+ que admite Silverlight 4+, Windows Phone 8, Windows 8, incluidas las aplicaciones universales y Mono.
  • Microsoft.Extensions.DependencyInjection : contenedor IoC predeterminado para aplicaciones ASP.NET Core.
  • Scrutor – Extensiones de escaneo de ensamblaje para Microsoft.Extensions.DependencyInjection.
  • Implementación de VS MEF – Managed Extensibility Framework (MEF) utilizada por Visual Studio.
  • TinyIoC : Un contenedor de inversión de control fácil de usar y sin complicaciones para pequeños proyectos, bibliotecas y principiantes.

La respuesta original sigue.


Supongo que podría ser un poco quisquilloso aquí, pero es importante tener en cuenta que DI (Inyección de Dependencia) es un patrón de progtwigción y es facilitado por, pero no requiere, un marco de IoC (Inversion of Control). Los marcos de IoC simplemente hacen que DI sea mucho más fácil y brindan una serie de otros beneficios además de DI.

Dicho eso, estoy seguro de que eso es lo que estabas preguntando. Acerca de Frameworks de IoC; Solía ​​usar mucho Spring.Net y CastleWindsor , ¡pero el verdadero dolor en el trasero era toda esa molesta configuración de XML que tenías que escribir! Se están moviendo bastante de esta manera ahora, así que he estado usando StructureMap durante el último año y, como se ha movido a una configuración fluida usando generics fuertemente tipados y un registro, mi barrera contra el dolor al usar IoC ha disminuido a ¡bajo cero! Me da una absoluta sensación saber ahora que mi configuración de IoC está comprobada en tiempo de comstackción (en su mayor parte) y que no he tenido más que alegría con StructureMap y su velocidad. No diré que los otros fueron lentos en el tiempo de ejecución, pero me resultaron más difíciles de configurar y la frustración a menudo ganó el día.

Actualizar

He estado usando Ninject en mi último proyecto y ha sido un placer absoluto de usar. Las palabras me fallan un poco aquí, pero (como decimos en el Reino Unido) este marco es ‘los Perros’. Lo recomendaría encarecidamente para cualquier proyecto de campos verdes en el que quiera que esté listo y funcionando rápidamente. Obtuve todo lo que necesitaba de un fantástico conjunto de screencasts de Ninject de Justin Etheredge. No puedo ver que el ajuste retroactivo de Ninject en el código existente sea un problema en absoluto, pero luego podría decirse lo mismo de StructureMap en mi experiencia. Va a ser una decisión difícil avanzar entre los dos, pero prefiero tener competencia que estancamiento y hay una buena cantidad de competencia saludable por ahí.

Otros screencasts IoC también se pueden encontrar aquí en Dimecasts .

Depende de lo que está buscando, ya que cada uno tiene sus pros y sus contras.

  1. Spring.NET es el más maduro a medida que sale de Spring desde el mundo de Java. Spring tiene un conjunto muy rico de bibliotecas de marcos que se extienden para admitir Web, Windows, etc.
  2. Castle Windsor es uno de los más utilizados en la plataforma .NET y tiene el ecosistema más grande, es altamente configurable / extensible, tiene administración de por vida personalizada, soporte AOP, soporte inherente de NHibernate y es un contenedor increíble. Windsor es parte de una stack completa que incluye Monorail, Active Record, etc. NHibernate se construye sobre Windsor.
  3. Structure Map tiene una configuración muy rica y fina a través de una DSL interna.
  4. Autofac es un contenedor IoC de la nueva era con todo su soporte de progtwigción funcional inherente. También toma un enfoque diferente en la gestión de la vida que los demás. Autofac sigue siendo muy nuevo, pero empuja la barra sobre lo que es posible con IoC.
  5. Ninject He escuchado que hay más huesos desnudos con un enfoque menor (no se escucha).
  6. El mayor discriminador de Unity es: es de y es compatible con Microsoft (p & p). Unity tiene muy buen rendimiento y una gran documentación. También es altamente configurable. No tiene todas las campanas y silbatos de Castle / Structure Map.

Entonces, en resumen, realmente depende de lo que es importante para ti. Estoy de acuerdo con otros en ir y evaluar y ver cuál encaja. Lo bueno es que tienes una buena selección de rosquillas en lugar de solo tener una gelatina.

Autofac. https://github.com/autofac/Autofac Es realmente rápido y bastante bueno. Aquí hay un enlace con comparaciones (hecho después de que Ninject solucionó un problema de fuga de memoria).

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html

Ninject es genial. Parece realmente rápido, pero no he hecho ninguna comparación. Sé que Nate, el autor, hizo algunas comparaciones entre Ninject y otros marcos DI y está buscando más formas de mejorar la velocidad de Ninject.

Escuché que muchas personas a las que respeto dicen cosas buenas sobre StructureMap y CastleWindsor. Esos, en mi opinión, son los tres grandes a mirar en este momento.

Yo uso Simple Injector :

Simple Injector es una biblioteca de dependency injections fácil, flexible y rápida que utiliza las mejores prácticas para guiar sus soluciones hacia el abismo del éxito.

Soy un gran fan de Castle. Me encantan las instalaciones que también ofrece más allá de la historia de IoC Container. Realmente me gusta usar NHibernate, logging, AOP, etc. También uso Binsor para la configuración con Boo y realmente me he enamorado de Boo como un lenguaje por eso.

Puedo recomendar Ninject. Es increíblemente rápido y fácil de usar, pero solo si no necesita configuración XML; de lo contrario, debería usar Windsor.

Pasé la mayor parte del día luchando sin éxito para obtener el ejemplo más simple de Spring.NET funcionando. Nunca podría averiguar cómo conseguirlo para encontrar mi ensamblado a partir del archivo XML. En aproximadamente 2 horas, por otro lado, pude hacer que Ninject funcionara, incluida la integración de pruebas tanto con NUnit como con MSTest.

He utilizado Spring.NET en el pasado y tuve un gran éxito con él. Nunca noté ningún gasto sustancial con él, aunque el proyecto en el que lo usamos era bastante pesado por sí mismo. Solo tomó un poco de tiempo leer la documentación para configurarlo.

Lo mejor de C # es que está siguiendo un camino derrotado por años de desarrolladores de Java antes que él. Entonces, mi consejo, en términos generales, cuando busco herramientas de esta naturaleza, es buscar la respuesta sólida de Java y ver si existe una adaptación de .NET aún.

Entonces, cuando se trata de DI (y hay tantas opciones por ahí, esto realmente es una cuestión de gusto) es Spring.NET . Además, siempre es aconsejable investigar a las personas detrás de los proyectos. No tengo ningún problema para sugerir productos SourceGear para control de código fuente (fuera de usarlos) porque respeto a Eric Sink. He visto a Mark Pollack hablar y lo que puedo decir, el tipo simplemente lo entiende.

Al final, hay una gran cantidad de marcos DI y su mejor opción es hacer algunos proyectos de muestra con algunos de ellos y tomar una decisión educada.

¡Buena suerte!

Creo que un buen lugar para comenzar es con Ninject, es nuevo y ha tenido en cuenta una gran cantidad de ajustes y es realmente rápido. Nate, el desarrollador, realmente tiene un gran sitio y un gran soporte.

Spring.Net es bastante sólido, pero la documentación tardó un poco en abrirse paso. Autofac es bueno, y si bien .Net 2.0 es compatible, necesita VS 2008 para comstackrlo, o bien use la línea de comando para construir su aplicación.