Inyección de Dependencia para Tontos

La Dependencia de Inyección es un concepto muy sencillo: si tienes un objeto que interactua con otros objetos, la responsabilidad de encontrar una referencia a estos objetos en tiempo de ejecución se saca fuera del objeto en si mismo.

¿Qué significa para un objeto “interactuar” con otros objetos? Generalmente significa invocar métodos o leer atributos de estos objetos. Así si tenemos una clase A que invoca el método Calculate de la clase B, podemos decir que A interactua con B.

En el siguiente ejemplo se muestra una clase A interactuando con una clase B. También podemos decir que A depende de la clase B para llevar a cabo una responsabilidad. En este caso, no solo se invoca al método Calculate pero también se crea una nueva instancia de la clase.

En el siguiente ejemplo, la responsabilidad de hacer una referencia a una implementación de una clase de tipo B se mueve fuera de A.

En este caso se dice que una dependencia (B) ha sido inyectada dentro de A, mediante el constructor. Por supuesto, también se pueden inyectar dependencias a través de un atributo (o incluso en un método), como en el ejemplo siguiente:

Esto es todo lo que hay sobre la inyección de dependencia. Todo lo demás se basa en este concepto básico.

Como por ejemplo las herramientas de Inversión de Control (IoC) que ayuda conectar los objetos en tiempo de ejecución, inyectando todas las dependencias según sea necesario. Entonces, ¿qué es exactamente la inversión de control y cómo se relaciona con la inyección de dependencias (DI)?

Me gusta asociar la IoC a el Hollywood Principle: “No nos llame, nosotros te llamaremos”. IoC es un principio de diseño donde el código reutilizable controla la ejecución del código de un problema específico: es una característica de muchos frameworks, donde la aplicación está construida extendiendo o personalizando un esqueleto común, se ponen las clases en puntos específicos y el framework las llama cuando es necesario.

Puedes utilizar un contenedor IoC como un framework para llevar a cabo la inyección de dependencia en tú lugar: decirle al contenedor cuales son las implementaciones concreta de las clases para las dependencias y el contenedor asegurará que sus constructores o setters serán llamados con los objetos adecuados.

Por lo tanto, los contenedores IoC son sólo una comodidad para simplificar como se maneja la inyección de dependencias. Pero incluso si no usas uno puedes realizar manualmente la inyección de dependencias.

(Si quieres echar un vistazo a cómo funciona un contenedor IoC puedes ir al tutorial mini tutorial on Ninject de Stefano Ricciardi)

¿Por qué el concepto de inyección de dependencias es tan importante? Porque mediante su utilización, se simplifica el diseño (que separa la responsabilidad de usar un objeto de la responsabilidad de recuperar ese objeto) y el código se vuelve mucho más fácil de probar, ya que se puede falsearse las dependencias sustituyéndolos con falsos (stub) objetos. Pero eso es tema para otro post.

Éste post es una traducción del articulo Dependency Injection for Dummies de Stefano Ricciardi.

ENLACE: http://stefanoricciardi.com/2011/11/08/dependency-injection-for-dummies/