Inyección de Dependencias en JavaScript: Guía Completa para Principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Inyección de Dependencias en JavaScript: qué es y por qué es necesaria



En el mundo del desarrollo moderno con JavaScript (Node.js), la limpieza y el mantenimiento del código se vuelven críticamente importantes. Uno de los principios clave que ayudan a lograr esto es la Inyección de Dependencias (DI). Este artículo está creado especialmente para principiantes, para explicar el concepto en un lenguaje sencillo con ejemplos prácticos.



Imagine que está ensamblando una computadora. En lugar de soldar la tarjeta de video directamente a la placa base de forma permanente, utiliza ranuras PCI-E. Esto permite reemplazar fácilmente la tarjeta de video por una más potente o usar otra para pruebas. La Inyección de Dependencias funciona bajo el mismo principio: no crea dependencias dentro de una clase (no las "suelda"), sino que las pasa desde el exterior.



El problema sin Inyección de Dependencias



Consideremos un ejemplo típico en Node.js, donde el código se vuelve fuertemente acoplado (tightly coupled):



class Logger {    log(message) {        console.log(`[LOG]: ${message}`);    }}

class UserService { constructor() { this.logger = new Logger(); // Dependencia rígida }

createUser(name) { this.logger.log(`Usuario creado: ${name}`); // Lógica de creación de usuario }}

const service = new UserService();service.createUser('Ana');


Aquí, UserService crea por sí mismo una instancia de Logger. Si queremos reemplazar console.log por escritura en un archivo o base de datos, tendremos que modificar el código de UserService. Esto viola el principio de abierto/cerrado (Open/Closed Principle) de SOLID.



Fundamentos de la Inyección de Dependencias en JavaScript



¿Qué es la Inyección de Dependencias?



La Inyección de Dependencias (DI) es un patrón de diseño en el cual un objeto recibe sus dependencias desde una fuente externa, en lugar de crearlas por sí mismo. En el contexto de JavaScript, esto significa pasar las dependencias a través del constructor, un setter o un parámetro de método.



Tres formas principales de inyectar dependencias



En JavaScript y Node.js se aplican tres enfoques:



  • Inyección por Constructor: las dependencias se pasan a través del constructor de la clase.
  • Inyección por Setter: las dependencias se establecen mediante un método separado (setter).
  • Inyección por Método: las dependencias se pasan directamente al método que las utiliza.


La más popular y recomendada es la Inyección por Constructor, ya que hace que las dependencias sean explícitas e inmutables después de crear el objeto.



Ejemplos prácticos de Inyección de Dependencias en Node.js



Ejemplo 1: Inyección por Constructor



Reescribamos nuestro ejemplo usando Inyección de Dependencias:



class Logger {    log(message) {        console.log(`[LOG]: ${message}`);    }}

class FileLogger { log(message) { // Simulación de escritura en archivo console.log(`[FILE]: ${message}`); }}

class UserService { constructor(logger) { this.logger = logger; // La dependencia se pasa desde el exterior }

createUser(name) { this.logger.log(`Usuario creado: ${name}`); // Lógica de creación de usuario }}

// Uso con diferentes loggersconst consoleLogger = new Logger();const fileLogger = new FileLogger();

const serviceWithConsole = new UserService(consoleLogger);serviceWithConsole.createUser('Ana'); // [LOG]: Usuario creado: Ana

const serviceWithFile = new UserService(fileLogger);serviceWithFile.createUser('Iván'); // [FILE]: Usuario creado: Iván


Ahora UserService no sabe qué logger específico se está utilizando. Nosotros

Blogs

Book Recommendations