La clave de los contenedores DI es la abstracción . Los contenedores DI resumen esta preocupación de diseño por usted. Como puede suponer, tiene un impacto notable en el código, a menudo traducido en un menor número de constructores, instaladores, fábricas y constructores. En consecuencia, hacen que su código esté más débilmente acoplado (debido a la IoC subyacente ), más limpio y simple. Aunque no sin un costo.
Antecedentes
Hace años, tal abstracción requería que escribiéramos varios archivos de configuración ( programación declarativa ). Fue fantástico ver que el número de LOC disminuía sustancialmente, pero aunque los LOCS disminuyeron, el número de archivos de configuración aumentó ligeramente. Para proyectos medianos o pequeños no fue un problema en absoluto, pero para proyectos más grandes, tener el "ensamblaje del código" disperso al 50% entre el código y los descriptores XML se convirtió en una molestia en ... Sin embargo, el problema principal fue paradigma en sí mismo. Era bastante inflexible porque los descriptores dejaban poco espacio para las personalizaciones.
El paradigma cambió progresivamente hacia la convención sobre la configuración , que intercambia archivos de configuración por anotaciones o atributos. Mantiene nuestro código más limpio y simple a la vez que nos proporciona la flexibilidad que XML no podría.
Probablemente, esta es la diferencia más significativa con respecto a cómo trabajaba hasta ahora. Menos código y más magia.
A la baja...
La convención sobre la configuración hace que la abstracción sea tan pesada que apenas se sabe cómo funciona. A veces parece mágico y aquí viene un inconveniente más. Una vez que funciona, a muchos desarrolladores no les importa cómo funciona.
Esta es una desventaja para aquellos que aprendieron DI con contenedores DI. No entienden completamente la relevancia de los patrones de diseño, las buenas prácticas y los principios abstraídos por el contenedor. Le pregunté a los desarrolladores si estaban familiarizados con DI y sus ventajas y respondieron: Sí, he usado Spring IoC . (¿¡¿Que demonios significa?!?)
Uno puede estar de acuerdo o no con cada uno de estos "inconvenientes". En mi humilde opinión, es imprescindible saber qué está pasando en su proyecto. De lo contrario, no tenemos una comprensión completa de ello. También es saber para qué sirve la DI y tener una idea de cómo implementarla es una ventaja a tener en cuenta.
En el lado positivo...
Una palabra de productividad . Los marcos nos permiten centrarnos en lo que realmente importa. El negocio de la aplicación.
A pesar de las deficiencias comentadas, para muchos de nosotros (qué trabajo está condicionado por plazos y costos), estas herramientas son un recurso invaluable. En mi opinión, este debería ser nuestro argumento principal a favor de implementar un contenedor DI. Productividad .
Pruebas
Ya sea que implementemos DI o contenedores puros, las pruebas no serán un problema. Todo lo contrario. Los mismos contenedores a menudo nos proporcionan los simulacros para las pruebas unitarias fuera de la caja. A lo largo de los años he usado mis pruebas como termómetros. Me dicen si he dependido mucho de las instalaciones de contenedores. Digo esto porque estos contenedores pueden inicializar atributos privados sin establecedores o constructores. ¡Pueden inyectar componentes casi en cualquier lugar!
Suena tentador ¿verdad? ¡Ten cuidado! ¡No caigas en la trampa!
Sugerencias
Si decide implementar contenedores, le sugiero que siga las buenas prácticas. Siga implementando constructores, setters e interfaces. Aplicar el marco / contenedor para usarlos . Facilitará las migraciones posibles a otro marco o eliminará el actual. Puede reducir significativamente la dependencia del contenedor.
Con respecto a estas prácticas:
Cuándo usar contenedores DI
Mi respuesta estará sesgada por mi propia experiencia, que está principalmente a favor de los contenedores DI (como comenté, estoy muy centrado en la productividad, por lo que nunca he tenido la necesidad de una DI pura. Todo lo contrario).
Creo que encontrará interesante el artículo de Mark Seeman sobre este tema, que también responde a la pregunta sobre cómo implementar la DI pura .
Finalmente, si estuviéramos hablando de Java, consideraría primero echar un vistazo al JSR330 - Inyección de dependencia .
Resumiendo
Beneficios :
- Reducción de costos y ahorro de tiempo. Productividad.
- Un menor número de componentes.
- El código se vuelve más simple y más limpio.
Inconvenientes :
- DI se delega a librerías de terceros. Debemos ser conscientes de sus compensaciones, fortalezas y debilidades.
- Curva de aprendizaje.
- Rápidamente te hacen olvidar algunos buenos hábitos.
- Aumento de las dependencias del proyecto (más libs)
- Los contenedores basados en la reflexión requieren más recursos (memoria). Esto es importante si estamos limitados por los recursos.
Diferencias con DI pura :
- Menos código y más archivos de configuración o anotaciones.