¿Qué marcos de inyección de dependencia de .NET valen la pena? [cerrado]

386

¿Qué marcos de inyección de dependencia de C # / .NET valen la pena analizar? ¿Y qué puedes decir sobre su complejidad y velocidad?

pbreault
fuente
13
IoC Container Benchmark: la comparación de rendimiento tiene tablas de comparación de rendimiento y características para más de 20 productos y los mantiene actualizados. Recomienda Simple Injector
Michael Freidgeim
Agradezco a Ninject y Maestro. Estoy feliz de que la respuesta mejor calificada refiera a Ninject como "un placer absoluto"
Razvan Dumitru
66
Me gustaría enfatizar que antes de mirar los contenedores de IoC, debe administrar sin uno. Realice su cableado e inyección manualmente, no es realmente complicado ni requiere mucho código a menos que tenga algunos sistemas realmente complejos o grandes. Cuando sienta que lo comprende y que se está volviendo más complejo, estará mejor preparado para comprender qué tipo de marco le ayudaría. pero no hay una regla que diga que un proyecto DEBE tener un contenedor de IoC solo para poder hacer DI correctamente.
Sara
1
Comience con ninguno. Crear objetos requeridos gráfico manualmente. Diferentes marcos tienen diferentes enfoques que dependen de sus necesidades. Antes de elegir uno, debe reconocer qué características necesita más.
Fabio
Dado que dotnetcore es el futuro, es mejor que te quedes con su soporte DI incorporado. Es muy bueno y altamente personalizable.
ATL_DEV

Respuestas:

340

editar (no por el autor): hay una lista completa de los marcos de IoC disponibles 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 maduro disponible para .NET y Silverlight
  • Unidad : contenedor de inyección de dependencia extensible y ligero con soporte para inyección de llamada de constructor, propiedad y método
  • Autofac : un adictivo contenedor .NET IoC
  • DryIoc : contenedor de IoC simple, rápido y 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 aplicaciones de código abierto que facilita la creación de aplicaciones empresariales .NET
  • LightInject : un contenedor de IoC ultra ligero
  • Simple Injector : Simple Injector es una biblioteca de inyección de dependencia (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 : el contenedor de IoC predeterminado para las aplicaciones ASP.NET Core.
  • Scrutor - Extensiones de escaneo de ensamblaje para Microsoft.Extensions.DependencyInjection.
  • VS MEF : implementación del marco de extensibilidad administrada (MEF) utilizada por Visual Studio.
  • TinyIoC : un contenedor de inversión de control fácil de usar y sin complicaciones para proyectos pequeños, bibliotecas y principiantes por igual.

La respuesta original sigue.


Supongo que podría ser un poco exigente aquí, pero es importante tener en cuenta que DI (Inyección de dependencia) es un patrón de programación y se ve facilitado por, pero no requiere, un marco IoC (Inversión de control). Los marcos de IoC simplemente hacen que la DI sea mucho más fácil y brindan una serie de otros beneficios además de la DI.

Dicho esto, estoy seguro de que eso es lo que estabas preguntando. Acerca de los marcos de IoC; Solía ​​usar Spring.Net y CastleWindsor mucho, ¡pero el verdadero dolor detrás era toda esa molesta configuración XML que tenía que escribir! Casi todos se están moviendo de esta manera ahora, por lo que he estado usando StructureMap durante el último año más o menos, y dado que se ha movido a una configuración fluida usando genéricos fuertemente tipados y un registro, mi barrera de dolor al usar IoC se ha reducido a ¡bajo cero! Me encanta saber ahora que mi configuración de IoC está verificada en tiempo de compilación (en su mayor parte) y no he tenido más que alegría con StructureMap y su velocidad. No diré que los otros fueron lentos en tiempo de ejecución, pero fueron 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 usarlo. 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 campo verde en el que desee estar en funcionamiento rápidamente. Obtuve todo lo que necesitaba de un fantástico conjunto de screencasts de Ninject de Justin Etheredge. No puedo ver que la adaptación de Ninject en el código existente sea un problema, pero lo mismo podría decirse de StructureMap en mi experiencia. Será una decisión difícil en el futuro entre esos dos, pero prefiero tener competencia que estancamiento y hay una buena cantidad de competencia saludable por ahí.

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

RobertTheGrey
fuente
1
Es genial ver una respuesta de calidad y bien pensada sobre los revestimientos. Me convenciste de revisar StructureMap.
Chris Marasti-Georg
77
Agradable pero para ser justos: Windsor también tiene una interfaz fluida y completa.
Krzysztof Kozmic
¿Podría explicar cuáles son los marcos de IoC "anfitriones de otros beneficios" además de la fácil implementación de DI?
fearofawhackplanet
@fearofawhackplanet una de las únicas cosas que puede hacer un contenedor de IoC que no se puede hacer con la DI del pobre es la intercepción . Buen resumen aquí: kenneth-truyers.net/2013/05/16/…
Mathieu Guindon
1
He leído un par de fuentes que dicen que Ninject es el más lento palmmedia.de/blog/2011/8/30/… y stackoverflow.com/questions/4581791/…
Luke T O'Brien
77

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

  1. Spring.NETes el más maduro ya que sale de Spring del mundo Java. Spring tiene un conjunto muy rico de bibliotecas de framework que lo extienden para admitir Web, Windows, etc.
  2. Castle Windsores uno de los más utilizados en la plataforma .NET y tiene el ecosistema más grande, es altamente configurable / extensible, tiene administración personalizada de por vida, soporte AOP, tiene soporte inherente de NHibernate y es un contenedor increíble. Windsor es parte de una pila completa que incluye monorraíl, registro activo, etc. NHibernate se construye sobre Windsor.
  3. Structure Map tiene una configuración muy rica y fina a través de un DSL interno.
  4. Autofaces un contenedor de IoC de la nueva era con todo su soporte de programación funcional inherente. También toma un enfoque diferente en la gestión de la vida que los demás. Autofac todavía es muy nuevo, pero empuja la barra de lo que es posible con IoC.
  5. Ninject He escuchado más huesos desnudos con un enfoque menos es más (escuchado no experimentado).
  6. El mayor discriminador de Unityes: es de y es compatible con Microsoft (p & p). La unidad tiene muy buen rendimiento y excelente documentación. También es altamente configurable. No tiene todas las campanas y silbatos de decir Castle / Structure Map.

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

Glenn Block
fuente
44
Autofac en realidad no es tan nuevo, es más antiguo que Unity :)
Nicholas Blumhardt
1
¿Dije que era más nuevo que Unity? Dije que es de la nueva era ... es decir, me refería a su naturaleza funcional. Bien, lo que dije aún es muy nuevo, lo que quise decir es que es naturaleza, no que TI era nuevo. :-)
Glenn Block
2
@Krzysztof: encuentro que Unity es muy fácil (al menos cuando se configura con fluidez en el código). ¿Qué te pareció doloroso?
TrueWill
1
@Krzysztof - Uso de la interfaz fluida de
UnityContainer
66
Aquí hay un punto de referencia de rendimiento interesante: palmmedia.de/Blog/2011/8/30/…
Steven
18

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.

He escuchado a muchas personas a las que respeto decir cosas buenas sobre StructureMap y CastleWindsor. Esos, en mi opinión, son los tres grandes a considerar en este momento.

ScottKoon
fuente
1
Ninject es popular pero ciertamente NO es rápido. En realidad, es uno de los más lentos: palmmedia.de/Blog/2011/8/30/…
Serj Sagan
13

Yo uso simple inyector :

Simple Injector es una biblioteca de inyección de dependencias fácil, flexible y rápida que utiliza las mejores prácticas para guiar sus soluciones hacia el pozo del éxito.

Steven
fuente
44
Tenga en cuenta que algunos consideran que el localizador de servicios es un antipatrón, incluido alguien que lo usó durante algún tiempo e incluso escribió una biblioteca para él: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
Philippe
44
Steven también es el creador de Simple Injector ... así que esta es una especie de respuesta spam ... especialmente porque usó una cuenta alternativa para hacerlo ... Simple Injector es bastante rápido: palmmedia.de/Blog/2011/ 8/30 / ...
Serj Sagan
8

Soy un gran admirador de Castle. Me encantan las instalaciones que también ofrece más allá de la historia de IoC Container. Realmente simplifica el uso de NHibernate, el registro, AOP, etc. También uso Binsor para la configuración con Boo y realmente me he enamorado de Boo como lenguaje debido a ello.

Chris Canal
fuente
5

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

Julio Cesar
fuente
1
¡NO es rápido! ¡Es uno de los marcos DI más lentos que existen! palmmedia.de/Blog/2011/8/30/…
Serj Sagan
@Serj Sagan Para ser justos, esos resultados son antiguos (6 años ahora)
Timothy Kanski
5

Pasé la mayor parte del día luchando sin éxito para que el ejemplo más simple de Spring.NET funcionara. Nunca podría encontrar la manera de conseguir que encuentre mi ensamblado desde el archivo XML. En aproximadamente 2 horas, por otro lado, pude hacer que Ninject funcionara, incluida la integración de pruebas con NUnit y MSTest.

sol
fuente
4

He usado Spring.NET en el pasado y tuve un gran éxito con él. Nunca noté una sobrecarga sustancial con él, aunque el proyecto en el que lo usamos fue bastante pesado por sí solo. Solo tomó un poco de tiempo leer la documentación para configurarla.

Jason Sparks
fuente
2

Lo mejor de C # es que sigue un camino recorrido por años de desarrolladores de Java anteriores. Por lo tanto, mi consejo, generalmente hablando cuando se buscan herramientas de esta naturaleza, es buscar la respuesta sólida de Java y ver si todavía existe una adaptación .NET.

Entonces, cuando se trata de DI (y hay tantas opciones, esto es realmente una cuestión de gustos) es Spring.NET . Además, siempre es aconsejable investigar a las personas detrás de los proyectos. No tengo problemas para sugerir productos SourceGear para el control de la fuente (fuera de usarlos) porque respeto a Eric Sink. He visto a Mark Pollack hablar y qué puedo decir, el tipo lo entiende.

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

¡Buena suerte!

Ian Patrick Hughes
fuente
2

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

Rob Bazinet
fuente
¿Por qué dices que es rápido? ¡Es uno de los más lentos que hay! palmmedia.de/Blog/2011/8/30/…
Serj Sagan
2

Spring.Net es bastante sólido, pero la documentación tomó un tiempo para avanzar. Autofac es bueno, y aunque .Net 2.0 es compatible, necesita VS 2008 para compilarlo, o bien usar la línea de comandos para construir su aplicación.

David Robbins
fuente