Para hacer esto bien, primero debemos definir las dependencias y la inyección.
- Dependencia: cualquier recurso que necesita una operación.
- Inyección: pasar ese recurso a la operación, generalmente como un argumento para un método.
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).