¿Qué es la inversión de control y cómo se relaciona con la inyección de dependencias?
La inversión de control es un concepto clave en el desarrollo de software moderno que asigna el control de ejecuciones específicas a otro componente o framework. Imagínate que conduces un vehículo; tienes el control total del manejo. Pero, si el vehículo es autónomo, ya no decides cuándo acelerar o frenar. El control fue cedido. Traducido al lenguaje de programación, en las pruebas unitarias, es el framework quien decide cómo se ejecuta el servicio, lo cual es un ejemplo de inversión de control.
La inyección de dependencias es una técnica que viene a solucionar problemas relacionados con la inversión de control, liberando al objeto de la preocupación de cómo obtener sus dependencias. Así, un objeto puede trabajar con sus dependencias sin conocer cómo se instancian o resuelven.
¿Cómo se implementa la inyección de dependencias?
En el mundo del desarrollo de software, la inyección de dependencias se realiza de diversas formas, pero todas comparten un principio: las dependencias son proporcionadas desde fuera del objeto que las necesita.
Inyección por constructor: Esta es la forma más común y consiste en pasar las dependencias mediante el constructor del objeto. En el ejemplo de código presentado, un servicio necesita un flight repository pasado a través del constructor.
Inyección por método 'setter': Se permite inyectar la dependencia a través de un método específico. No siempre es la primera opción, pero puede ser adecuado cuando la creación inmediata no es crítica.
Inyección por interfaz: Menos común, pero igualmente efectiva. Consiste en tener una interfaz que define un método específico para inyectar. Es particularmente útil en situaciones donde la flexibilidad de implementación es crucial.
¿Por qué elegir la inyección de dependencias?
Existen varias razones poderosas para adoptar la inyección de dependencias en el desarrollo de software:
Flexibilidad: Permite alternar entre diferentes implementaciones de una interfaz sin necesidad de modificar el servicio o la lógica del negocio.
Transparencia: El servicio no necesita conocer los detalles de la implementación de las dependencias, lo cual se traduce en reducción de acoplamiento.
Facilidad de pruebas: La inyección de dependencias facilita la integración de pruebas mediante la sustitución de implementaciones reales por 'mocks' o versiones de prueba.
Separación de responsabilidades: Despeja al servicio del trabajo relacionado con el manejo de dependencias, lo cual permite enfoque y simplificación del código.
¿Cuál es el papel de los frameworks en la inyección de dependencias?
A pesar de que la inyección de dependencias puede ser implementada manualmente, existen frameworks que simplifican y automatizan el proceso. Frameworks como Spring en Java son populares por su habilidad para manejar la inyección de dependencias de manera eficiente, aliviando a los desarrolladores de la carga de instanciar y gestionar objetos, promoviendo un desarrollo más limpio y menos propenso a errores.
Tomar las riendas en entender e implementar inyección de dependencias reforzará tu habilidad para manejar proyectos de software cada vez más complejos. Entrégate al aprendizaje, experimenta las diversas técnicas y frameworks. ¡El dominio del código está a tu alcance!
Quiero hacer un aporte donde se explica claramente con un ejemplo el concepto de Inyección de Dependencias:
Muy buen ejemplo, gracias por compartirlo.
Está muy claro, gracias
Inyección de dependencias
Inversión de Control (IoC)
Un objeto o programa cede el control a alguien más.
Inyección de Dependencias (DI)
Es una forma de implementar inversión de control. Es una técnica donde a un objeto le proveen las dependencias que necesita.
Formas de hacer inyección de depencias
Por constructor.
Por setter.
Por método.
Por interfaz.
La Inyección de Dependencias (Dependency Injection, DI) y la Inversión de Control (Inversion of Control, IoC) son dos conceptos relacionados que se utilizan en el desarrollo de software para mejorar la modularidad, la flexibilidad y la mantenibilidad de una aplicación.
.
La Inversión de Control (IoC) es un principio de diseño que busca invertir el control de la ejecución de un programa. En lugar de que un componente de software controle y gestione directamente sus dependencias y recursos, el control se delega a un contenedor o framework que maneja la creación y la resolución de dependencias. El componente simplemente declara las dependencias que necesita y el contenedor las provee.
.
La Inyección de Dependencias (DI) es una técnica específica que se utiliza para implementar la Inversión de Control. En la DI, las dependencias de un componente son inyectadas en él en tiempo de ejecución, en lugar de ser creadas o gestionadas directamente por el propio componente. Esto se logra definiendo interfaces o clases abstractas para las dependencias, y luego configurando un contenedor o un framework para que resuelva e inyecte las implementaciones concretas en el componente.
No me está quedando claro lo que explica el docente. Me parece que utiliza palabras muy enredadas.
No te desanimes las palabras o conceptos que no entiendas pregúntale a chatGPT, la experiencia y el tiempo te dan el lenguaje para que le entiendas a los docentes, éxito con los conceptos y palabras que no entiendas al final adecua el mejor sinónimo ya conceptualizado.
Creen que en un enfoque de POO los métodos heredados de la clase padre aunque pueda modificarse sus comportamientos en lo hijos “polimorfismo” puedan ser considerados como una inyección de dependencia?
Yo empecé hace poco a crear proyectos con arquitectura limpia, es muy útil en muchos sentidos.
Pero creo que es muy importante que para esta clase ya hayamos empezado a crear por nuestra propia cuenta un proyecto con arquitectura limpia, hacer esto me ayudó mucho a ver realmente qué significa cada cosa.
Y si tienen oportunidad de leer el libro de Arquitectura limpia del Tío Bob, sería genial, lo más importante son los capítulos precedentes al de arquitectura limpia, así que no se los salten.
Para los backend, siquieren un buen ejemplo de inyeccion de dependencias vayan al curso de nestjs
No estaba conciente del tema de la inyección si no hasta hace algunos meses que comencé a desarrollar en golang, muy interesante conocer los métodos ya que si lo he implementado más no conocía a detalle el concepto, y veo que hay más formas de hacerlo, interesante creare un repo para aprender a implementarlos de las diferentes formas.
En lo personal, lo uso mucho en .NET 6,7 lo uso siempre, para .NET Framework he usado AutoFac para registar y resolver la dependencias a lo largo de la aplicación. La forma que he usado para inyectar ha sido por medio de constructor.
He utilizado en abp.io que permite realizar esos tipos de dependencias.
Las clases no deben crear sus propias dependencias, sino que deben recibirlas desde afuera.
El objeto recibirá las dependencias, no las controlará.
Formas de inyección de dependencias
Por Constructor
Las dependencias se inyectan al crear la instancia.
Se entregan obligatoriamente al crear el objeto.
Garantiza que el objeto no pueda existir sin las dependencias.
Es la forma más recomendada en Clean Architecture.
Ventajas
Asegura que el objeto siempre tenga lo que necesita.
Evita estados inconsistentes.
Mejora la claridad y testabilidad.
Por Setter
Las dependencias se asignan o cambian después de crear el objeto mediante un setter.
Cuándo usar:
Cuando la dependencia es opcional.
Cuando podría cambiar dinámicamente (caso poco común).
Riesgos:
Puede fallar en ejecución si se olvida configurar la dependencia.
Cambios dinámicos pueden generar comportamientos inesperados.
✅ Por Método
La dependencia se pasa directamente al llamar al método.
Cuándo usar:
Si la dependencia es usada solo en acciones específicas.
Desventajas:
Repetitivo si es necesaria en muchos métodos.
No recomendable para dependencias esenciales.
✅ Por Interfaz
Forma de diseñar más que de inyectar.
No se depende de implementaciones concretas.
El objeto solo conoce una abstracción (interfaz) con los métodos que necesita.
Beneficios:
Desacopla la lógica de negocio de detalles técnicos.
Facilita el cambio de implementaciones (ej: cambiar base de datos).
Mejora la testabilidad mediante mocks o fakes.
Cumple con el principio de inversión de dependencias.
Antes he usado la inyección de dependencias, inicialmente la aprendí en spring boot con la anotación @Autowired (la cual entiendo que implica que el servicio sea un objeto pojo - getters, setters y constructor vacío), sin embargo, me parece que se ve un poco más limpia la inyección por constructor.
en el caso de .net la practica habitual en mi es poder crear una interfaz con una serie de metodos, luego los implemento en una clase donde coloco todoa la logica del corresponde a ese metodo y posteriormente para compartilo en todo el programa ... en un lugar generico el program inyecto la interfaz y la clase donde se implmenta posteriormete esa inyeccion puede ser usada desde el controlador o en cualquier otro lugar de la aplicacion
Eh Utilizado la inyección de dependencias por medio del framework de Spring Boot
La inyección de dependencia ("Dependency Injection" o "DI") es un patrón de diseño utilizado principalmente en programación orientada a objetos para lograr la inversión de control y mejorar la modularidad y la capacidad de prueba de un software.
En términos simples, la inyección de dependencia se refiere a la técnica de suministrar a un objeto sus dependencias (objetos o valores que necesita para funcionar) desde el exterior, en lugar de que el objeto las cree por sí mismo. Esto tiene varias ventajas:
Desacoplamiento: La inyección de dependencia permite que los componentes de un sistema estén menos acoplados entre sí. Un objeto no necesita saber cómo crear sus dependencias; simplemente las recibe.
Reutilización: Los componentes se vuelven más reutilizables porque no están fuertemente acoplados a sus dependencias. Puedes cambiar las implementaciones de las dependencias sin tener que modificar el componente que las utiliza.
Testabilidad: Facilita las pruebas unitarias, ya que puedes inyectar objetos simulados o mock (imitaciones) en lugar de los objetos reales. Esto permite probar unidades individuales de código sin depender de implementaciones concretas de sus dependencias.
Muy buena explicación de los conceptos de inversión de control y de inyección de dependencias. Llegue a utilizar estas técnicas antes de saber la utilidad o de conocer mejor su definición porque, en mis primeros trabajos, me toco hacer uso de frameworks construidos de manera interna que implementaban mucho de lo visto en el video.
Carai, jamás había entendido con tanta claridad lo que es la inyección de dependencias. Alto crack!
He utilizado principalmente la inyección de dependencias en el ecosistema Java, tanto con Spring como con el stack JEE desde la versión 6.