Inyección de Dependencias e Inversión de Control ¿No es lo mismo?

Publicada en Publicada en Código, Diseño de Software

Compartelo con tus amigos!

El fin de semana conversaba con un ex-compañero de la universidad y tocamos los “temas de moda” (por así llamarlos) sobre el diseño de aplicaciones y llegamos una debate que me dejo pensando, y es que hoy en día se habla muchísimo sobre la Inyección de Dependencias pero casi nunca nos hablan sobre la Inversión de Control y en algún momento llegamos a pensar que es lo mismo, cuando son 2 patrones diferentes.

Inversión de Control (IoC)

Es un método de trabajo en el cual el flujo de ejecución de un programa se invierte (con respecto al método de trabajo tradicional) para ello se requiere de un agente externo (normalmente un contenedor) quien se encargará de hacer las conexiones necesarias entre la clases dependientes, este agente externo es el que se encarga del flujo del programa, de esta forma se puede implementar código con bajo acoplamiento.

El ejemplo más claro para entender como trabaja la inversión de control se ve cuando programamos una aplicación WinForms, para ello creamos un Formulario que hereda de una clase base Form, e implementa eventos como OnPaint, OnClick, etc., casi nunca accedemos a la cola de mensajes para  (por ejemplo) responder a un WM_PAINT (muchos ni siquiera saben que existía una cola de mensajes), el Framework se encarga de realizar el manejo de estos mensajes e invoca a los métodos de necesarios para responder; en otras palabras es el framework quien se encarga del flujo del programa.

Inyección de Dependencia (DI)

Este patrón de diseño la idea es suministrar los objetos a una clase en lugar de que la clase sea quien cree dichos objetos. La forma mas “popular” de implementar este patrón es a través de interfaces y poner las dependencias como parámetros en el constructor de una clase:

public class ClaseEjemplo
{
    public ClaseEjemplo(IDependencia dependencia)
    {
            
    }
}

de esta forma nos aseguramos de que al crear el objeto este cuente con todas las dependencias necesarias para trabajar; sin embargo, existen otras formas de inyectar la dependencia como son a través de propiedades, o como parámetros en los métodos:

public class ClaseEjemplo
{
    public int Calcular(IEvaluadorExpresiones evaluador)
    {
    }
}

Utilizar la inyección de dependencias permite crear componentes con bajo acoplamiento.


Ambos patrones requieren de un contenedor para su implementación, es decir hablamos de un contenedor de IoC y un contenedor de DI; existen en el mercado muchos frameworks y librerias que implementan ambos patrones (como en el caso de Castle Windsor); quizá por esta razón es que muchos piensan que IoC y DI son lo mismo.

 

Compartelo con tus amigos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *