Cada vez que alguien me alcanza y me pide que defina la Inyección de dependencia de una manera conceptual y explique los pros y los contras reales del uso de DI en el diseño de software. Confieso que tengo algunas dificultades para explicar los conceptos de DI. Cada vez que necesito contarles la historia sobre el principio de responsabilidad única, la composición sobre la herencia, etc.
¿Alguien puede ayudarme a explicar la mejor manera de describir la DI para los desarrolladores?
design
design-patterns
software
Tiago Sampaio
fuente
fuente
Respuestas:
La inyección de dependencia es un nombre horrible (IMO) 1 para un concepto bastante sencillo. Aquí hay un ejemplo:
DbContext
). Este recurso interno es lo que se llama dependenciaDbContext
) del método y hace que la persona que llama sea responsable de proporcionar este recurso (como un parámetro del método o al crear una instancia de la clase)[1] : vengo de un nivel inferior y me llevó meses sentarme y aprender la inyección de dependencia porque el nombre implica que sería algo mucho más complicado, como la inyección de DLL . El hecho de que Visual Studio (y nosotros los desarrolladores en general) se refiera a las bibliotecas .NET (DLL o ensamblados ) de las que depende un proyecto como dependencias no ayuda en absoluto. Incluso existe el Dependency Walker (depe.exe) .
[Editar] Supuse que algunos códigos de demostración serían útiles para algunos, así que aquí hay uno (en C #).
Sin inyección de dependencia:
Su consumidor entonces haría algo como:
La misma clase implementada con el patrón de inyección de dependencia sería así:
Ahora es responsabilidad de quien llama crear una instancia
DbContext
y pasarla (errm, inyectarla ) a su clase:fuente
Los conceptos abstractos a menudo se explican mejor utilizando una analogía del mundo real. Esta es mi analogía:
No es perfecto, pero destaca la característica clave: dar control al consumidor . El beneficio mutuo inherente es que ya no tiene que adquirir sus propias dependencias, y su consumidor no se ve obstaculizado en su elección de dependencia.
fuente
Respuesta simple a eso:
.Net Core es un buen ejemplo que puede dar porque este marco utiliza mucha inyección de dependencia. En general, los servicios que desea inyectar se encuentran en el
startup.cs
archivo.Claro, el alumno debe conocer algunos conceptos como el polimorfismo, las interfaces y los principios de diseño de OOP.
fuente
Hay mucha pelusa y tonterías en torno a lo que es, en esencia, un concepto simple.
También es muy fácil empantanarse con " qué marco debo usar " cuando puede hacerlo simplemente en código.
Esta es la definición que uso personalmente:
Algunos ejemplos podrían ser donde Y es un sistema de archivos o una conexión de base de datos.
Los marcos como moq permiten que se definan dobles (versiones simuladas de Y) utilizando una interfaz para que sea posible inyectar en una instancia de Y, donde Y es, por ejemplo, una conexión de base de datos.
Es fácil caer en la trampa de creer que esto es puramente una preocupación de prueba de unidad, pero es un patrón muy útil para cualquier parte de código donde se espera un cambio y podría decirse que es una buena práctica de todos modos.
fuente
Proporcionamos el comportamiento de una función en tiempo de ejecución a través del método de insertar ese comportamiento en la función a través de un parámetro.
El Patrón de estrategia es un excelente ejemplo de inyección de dependencia.
fuente
Para hacer esto bien, primero debemos definir las dependencias y la inyección.
Un ejemplo rudimentario sería un método que agrega dos valores. Obviamente, este método necesita que se agreguen los valores. Si se proporcionan pasándolos como argumentos, esto ya sería un caso de inyección de dependencia. La alternativa sería implementar los operandos como propiedades o variables globales. De esa manera no se inyectarían dependencias, las dependencias estarían disponibles externamente por adelantado.
Suponga que usa propiedades en su lugar y las nombra A y B. Si cambia los nombres a Op1 y Op2, rompería el método Add. O su IDE actualizaría todos los nombres por usted, el punto es que el método también necesitaría actualizarse porque tiene dependencias de recursos externos.
Este ejemplo es básico, pero puede imaginar ejemplos más complejos donde el método realiza una operación en un objeto como una imagen o donde se lee desde una secuencia de archivos. ¿Desea que el método alcance la imagen, requiriéndole saber dónde está? No. ¿Desea que el método abra el archivo en sí mismo, requiriéndole saber dónde buscar el archivo o incluso saber que se leerá desde un archivo? No.
El punto: reducir la funcionalidad de un método a su comportamiento principal y desacoplar el método de su entorno. Obtiene el primero haciendo el segundo, puede considerar esta la definición de inyección de dependencia.
Los beneficios: dado que se han eliminado las dependencias para el entorno del método, los cambios en el método no afectarán el entorno y viceversa. => La aplicación se vuelve más fácil de mantener (modificar).
fuente