Inversión de Control e Inyección de dependencia no son lo mismo

Algunas plataformas como el framework Spring o .NET Framework, han creado la percepción de que IoC y DI son la misma cosa. Aunque han decidido llamar IoC a algo que tiene que ver con inyección de dependencia, en realidad la Inversión de Control es algo más que simplemente instanciar cosas y pasarlas en un constructor.

La inversión de control es una técnica de programación en la que cedemos parte del control de nuestro programa a la plataforma, en vez de tenerlo todo el tiempo. De ahí el nombre de inversión de control, porque se invierte precisamente.

Por ejemplo, a menudo cuando se empieza a programar, los primeros programas que escribimos llevan un método main donde coordinamos toda la ejecución, desde que iniciamos el programa hasta que este termina.

Al invertir la dependencia, precisamente dejamos de tener este tipo de control. La plataforma (por ejemplo, el framework que estemos usando) tiene su propia rutina de inicialización, y nosotros sólamente especificamos el código que queremos que eventualmente se ejecute en la plataforma, cuando ésta lo decida, porque para eso tiene el control.

Esta es la forma en la que funciona cualquier framework web. Te habrás dado cuenta que, por ejemplo, en muchos frameworks existe un comando específico para lanzar la aplicación, pero no hace falta escribir el main. En Spring Boot, por ejemplo, sí que es común que escribamos el método main, pero aun así eventualmente llamas a SpringApplication.main() y a partir de ahí empiezan a pasar cosas que ya no controlas, pero que eventualmente te devuelven el control, por ejemplo, cuando se disparan tus callbacks o cuando se invoca un controlador que hayas declarado. En el mundo de C#, pasa algo parecido.

Incluso a pequeña escala, cuando haces una aplicación JavaScript en un framework como Express, sólamente especificas lo que quieres que haga tu aplicación web proporcionando los callbacks a funciones como app.get o app.post, pero ciertamente no tienes que programar manualmente el protocolo HTTP cada vez que haces una aplicación de este estilo. En estos casos, estamos usando inversión de control, porque cedemos el control del programa y lo invertimos para que en vez de tenerlo nuestro programa, lo tenga la plataforma.

Entonces, ¿qué diferencia hay entre Inversión de Control e Inyección de Dependencia? Creo que la confusión viene motivada porque algunos frameworks han decidido llamar IoC a su sistema de inyección de dependencia.

La inyección de dependencia es un tipo de inversión de control. Entonces, el no mbre tampoco está mal puesto, pero existen inversiones de control que no son inyección de dependencia.

Martin Fowler tiene un brillante artículo donde pone más ejemplos de otras técnicas de inversión de control que no son inyección de dependencia. Una aplicación gráfica o una aplicación orientada a eventos, por ejemplo, es otro tipo de inversión de control donde no necesariamente estamos usando técnicas de inyección de dependencia (salvo que lo apliquemos aparte). Se podría decir que el diseño de software orientado a callbacks o a e ventos es la alternativa más sencilla que nos ayuda a entender por qué no son lo mismo.

Así que en resumen, cuando te hablen de inversión de control y te mencionen sus siglas, IoC, no pienses inmediatamente en el uso de Autowireds o de Injects, como tal vez tengas costumbre a hacer de Spring, porque no son la misma cosa.

Lista de reproducción
  1. 1
    El patrón Iterator
    8 minutos
  2. 2
    El patrón Service Layer
    9 minutos
  3. 3
    Inversión de Control e Inyección de dependencia no son lo mismo
    8 minutos