Ejemplo de inyección de dependencias con C#

Explicaremos como funciona este patrón que es usado bastante en muchos frameworks actuales como ASP.NET MVC, Angular, Laravel, entre otros.

autor Rodríguez Patiño, Eduardo
publicado
visitas 56,946

Esta lección ha sido reescrita completamente otorgando otro ejemplo para aclarar de manera más simple el uso de dicho patrón.

¿Qué es?

Es un patrón de diseño que soluciona el problema del alto acoplamiento. Es decir, si en vez de que nuestra clase tenga la responsabilidad de instanciar las dependencias, nuestra recibirá las dependencias con las que se desea trabajar.

Ejemplo

Supongamos que tenemos el siguiente código.

class OrderService {
    private readonly EmailService _emailService;

    public OrderService () {
        _emailService = new EmailService();
    }
}

A simple vista este código no parece tener nada malo pero genera un fuerte acoplamiento.

Implementando Inyección de Dependencia

Desde mi punto de vista si es que hacemos un buen uso de este patrón vamos a crear un sistema modular. Pero para que pueda ser modular necesita trabajar un nivel de abstracción más alto; por eso, vamos hacer uso de interfaces.

class OrderService {
    private readonly IEmailService _emailService;

    public OrderService (
        IEmailService emailService) {
        _emailService = emailService;
    }
}

Han cambiado 2 cosas, la primera es que ahora reciben una interfaz en vez de una clase y la segunda es que ya no se instancia directamente de la clase.

¿Qué ganamos con esto?

Que nuestro código sea más modular.

Supongamos que hoy día trabajamos con MailChimp para enviar el correo, pero mañana por un tema de costos aparece otro provedor como SendInBlue que nos ofrece un mejor precio y nuestro CTO dice que vamos hacer uso de dicho proveedor.

Si nuestro código no se inyectará por el constructor y asimismo no fuera una interface, tendríamos que cambiar las dependencias de la clase EmailService en todo el proyecto.

En cambio, ahora quien cambiará la definición de dicha dependencia será el programa.

// hoy día
var orderService = new OrderService(
    new MailchimpService()
);

// mañana
var orderService = new OrderService(
    new SendInBlueService()
);

Tomen nota que tanto mailchimp como sendinblue deben implementar la misma interfaz para que se pueda resolver de manera polimórfica.

Conclusión

La inyección de depencencias busca que los diferentes componentes (clases) de nuestro proyecto pueden ser lo más desacoplados posibles.

De esta manera, cambiar una dependencia por otro no debe significar que tengamos que hacer cambio a nuestro código.

- Nuestros cursos -