Blog de Gonzalo

INYECCIÓN DE DEPENDENCIAS

Antes de explicar la inyección de dependencias hay que explicar el concepto de inverión de control que se puede definir como el proceso donde los objetos son suministrados a las clases que los necesitan, en lugar de crearlos ellos mismos. esto se puede ver fácilmente con un ejemplo sencillo:


class Newsletter {
protected $mail ;
function __construct() {
$this -> mail = New Mailer ('correo@gmail.com', ...) ;
}
}
Esta clase, para enviar correos, que todos implementaríamos, tiene un problema ya que se está creando una dependencia muy fuerte entre la clase Newsletter y la clase Mail. Una solución sería, aplicando la inversión de control:

class Newsletter {
protected $mail;
function __construct() {
$this -> mail = $mail ;
}
}

La solución propuesta es pasarle un objeto completamente configurado y preparado para enviar correos eliminando esa fuerte dependencia que existía entre las dos clases.
Ahora mismo estarás pensando que el problema no está solucionado todavía, que todavía has tenido que crear ese objeto Mail, configurarlo a mano y pasárselo a cada objeto que lo requiera. ¡Vamos paso a paso! La inyección de dependencias es un patrón de diseño, que trata de solucionar las necesidades de creación de los objetos de una manera práctica, útil, escalable y con una alta versatilidad del código y que nuestros objetos sean independientes comunicándose únicamente a través de un interface. Esto implica muchas modificaciones en el código fuente como el uso de implementaciones, la eliminación de la instanciación de objetos mediante la instrucción new o la necesidad de un modo de configuración que indique que clases se instanciarán en el caso de solicitarlo.
Para mostrar la inyección de dependencias en la práctica, vamos a ver un ejemplo muy sencillo. En este caso tenemos una clase llamada Database que requiere de un adaptador para poder comunicarse con la base de datos. En la primera versión del código se instancia el adaptador en el mismo constructor de la clase, lo que crea una dependencia muy fuerte entre estas dos partes del código. ësto hace que si en un futuro se necesita un cambio haya que cambiar el código.

class Database
{
protected $adapter;

public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}

A continuación se muestra como tendría que ser el código para utilizar la inyección de dependencias para reducir la dependencia entre los componentes de código.


class Database
{
protected $adapter;

public function __construct(MySqlAdapter $adapter)
{
$this->adapter = $adapter;
}
}

Ahora la aplicación le está pasando a la clase Database las dependencias que necesita. Además del constructor, el adaptador también se podría pasar mediante un método setter o mediante la propiedad $adapter si esta fuera pública.

Compartir en twitter