diferencia entre la inyección de dependencia (DI) y la inversión de control (IOC)

116

He estado viendo muchas referencias de Dependency Injection (DI) & Inversión de control (IOC), pero realmente no sé si hay una diferencia entre ellos o no.

Me gustaría comenzar a usar uno o ambos, pero estoy un poco confundido en cuanto a cómo son diferentes.

    
pregunta gnat 26.09.2008 - 14:54

4 respuestas

52

Definiciones

La inversión de control es un paradigma de diseño con el objetivo de reducir el conocimiento de las implementaciones concretas del código de marco de la aplicación y otorgar más control a los componentes específicos del dominio de su aplicación. En un sistema tradicional diseñado de arriba a abajo, el flujo lógico de la aplicación y la conciencia de dependencia fluyen desde los componentes superiores, los que se diseñaron primero, hasta los que se diseñaron en último lugar. Como tal, la inversión de control es una inversión casi literal del control y la conciencia de dependencia en una aplicación.

La inyección de dependencia es un patrón utilizado para crear instancias de clases en las que otras clases dependen sin saber en el momento de la compilación qué implementación se usará para proporcionar esa funcionalidad.

Trabajando juntos

La inversión de control puede utilizar la inyección de dependencia porque se necesita un mecanismo para crear los componentes que proporcionan la funcionalidad específica. Existen otras opciones y se utilizan, por ejemplo, activadores, métodos de fábrica, etc., pero los marcos no necesitan hacer referencia a esas clases de utilidad cuando las clases del marco pueden aceptar las dependencias que necesitan en su lugar.

Ejemplos

Un ejemplo de estos conceptos en el trabajo es el marco de plug-in en Reflector . Los complementos tienen un gran control del sistema a pesar de que la aplicación no sabía nada acerca de los complementos en el momento de la compilación. Se llama a un solo método en cada uno de esos complementos, Inicializar si se sirve la memoria, que pasa el control al complemento. El marco no sabe lo que harán, solo les permite hacerlo. Se ha tomado el control de la aplicación principal y se le ha dado al componente que realiza el trabajo específico; inversión de control.

El marco de la aplicación permite el acceso a su funcionalidad a través de una variedad de proveedores de servicios. Un complemento se le da referencias a los proveedores de servicios cuando se crea. Estas dependencias permiten que el complemento agregue sus propios elementos de menú, cambie la forma en que se muestran los archivos, muestre su propia información en los paneles apropiados, etc. Dado que las dependencias se pasan por la interfaz, las implementaciones pueden cambiar y los cambios no interrumpirán código mientras el contrato permanezca intacto.

En ese momento, se usaba un método de fábrica para crear los complementos utilizando la información de configuración, la reflexión y el objeto Activator (al menos en .NET). Hoy en día, hay herramientas, MEF para una, que permiten una gama más amplia de opciones al inyectar dependencias, incluida la capacidad de un marco de aplicación para aceptar una lista de complementos como una dependencia.

Summary

Si bien estos conceptos se pueden usar y proporcionar beneficios de forma independiente, juntos permiten escribir un código mucho más flexible, reutilizable y comprobable. Como tales, son conceptos importantes en el diseño de soluciones orientadas a objetos.

    
respondido por el Chuck 26.09.2008 - 15:22
0

Buen artículo para comprender IOC y DI enlace

IOC (Inversión de control)

IOC significa

  1. codificación a la interfaz (un componente debe depender de la interfaz de otro componente y no de la implícita), y por ejemplo,

    interface iComp_2 {...}
    
    class Comp_1 {
        iComp_2 c2 = ….;
    }
    
  2. eliminando el código específico de la implementación del componente por ejemplo,

    Comp_1 {
        iComp_2 c2 = getComp_2_Impl(); // not new Comp_2_Impl();
    }
    

El COI se puede lograr mediante uno de los siguientes:

1. DI (inyección de dependencia)

3 types of DI

1.1 Constructor Injection

1.2 Setter Injection

1.3 Interface Injection

2. Localizador de servicios

Contenedor DI (inyección de dependencia)

Determinación de la implementación del tiempo de ejecución y no tiempo de compilación: determina en el tiempo de ejecución qué implementación concreta de una interfaz se utilizará en función de algún archivo de configuración (por lo que en el momento de la compilación no sabemos qué implementación se va a utilizar y, por lo tanto, aumenta la configurabilidad de la aplicación). Es una implementación donde la relación concreta entre los diferentes módulos se decide en "tiempo de ejecución".

Creación de una instancia de impl después de la inyección de dependencia: después de determinar la implementación, crea una instancia de la implementación creando primero todas sus dependencias (especificadas en el archivo de configuración) y luego inyectando esas dependencias en esa implementación

Administración del ciclo de vida de las instancias: los contenedores DI generalmente solo mantienen una referencia a los objetos para los que necesitan administrar los ciclos de vida o que se reutilizan para inyecciones futuras, como singletons o contrapesos. Cuando se configura para crear nuevas instancias de algunos componentes para cada llamada al contenedor, el contenedor generalmente se olvida del objeto creado. De lo contrario, el recolector de basura tendría dificultades para recopilar todos estos objetos cuando ya no se usen.

    
respondido por el Yatendra Goel 24.03.2013 - 16:09
-3

Yo diría que "Inversión de control" es una forma de diseñar un sistema donde todos los módulos están pensados en entidades abstractas.

Y, "Inyección de dependencia" es una implementación donde la relación concreta entre los diferentes módulos se decide en el "tiempo de ejecución".

    
respondido por el mB. 03.03.2012 - 14:58
-4

La inversión de control es un concepto general, en los lenguajes funcionales se suele hacer utilizando continuaciones. Esto le permite escribir una API en la que ambos lados son "llamantes", y ninguno "llamante". En otros entornos más estáticos, no tiene esta funcionalidad, por lo que necesita este truco para insertar sugerencias en el flujo de control.

    
respondido por el Javier 26.09.2008 - 15:57

Lea otras preguntas en las etiquetas