Introducción a la Inyección de Dependencias

Introducción a la Inyección de Dependencias

Introducción a la Inyección de Dependencias en Express: Guía para Principiantes

Spring Framework. ¿Qué es la inyección de dependencias y cuales son sus  ventajas? - David Gómez Rubio

¿Te has preguntado cómo hacer tu código en Express más modular, testeable y mantenible? La inyección de dependencias (DI) es un patrón de diseño clave para lograrlo. En este post, aprenderás qué es y cómo aplicarlo paso a paso en tus proyectos.

¿Qué es la Inyección de Dependencias?

La inyección de dependencias es un patrón que consiste en proveer («inyectar») los componentes externos (dependencias) que un módulo necesita para funcionar, en lugar de que el módulo los cree internamente.

				
					// ❌ Acoplamiento fuerte: el servicio se crea dentro del controlador
class UserController {
  constructor() {
    this.userService = new UserService(); // Dependencia creada internamente
  }

  getUsers(req, res) {
    const users = this.userService.getAll();
    res.json(users);
  }
}
				
			

Ejemplo con DI:

				
					// ✅ Desacoplado: el servicio se recibe como parámetro
class UserController {
  constructor(userService) { // Dependencia inyectada
    this.userService = userService;
  }

  getUsers(req, res) {
    const users = this.userService.getAll();
    res.json(users);
  }
}
				
			

¿Por qué Usar Inyección de Dependencias en Express?

  1. Testeo simplificado: Puedes mockear dependencias fácilmente.
  2. Código reutilizable: Los módulos no están atados a implementaciones concretas.
  3. Mantenibilidad: Cambiar componentes afecta mínimamente al sistema.
  4. Escalabilidad: Añadir nuevas características es más sencillo.

Cómo Implementar DI en Express: Ejemplo Práctico

Paso 1: Definir Dependencias

Crea servicios independientes:

				
					// services/UserService.js
class UserService {
  getAll() {
    return [{ id: 1, name: "Ana" }, { id: 2, name: "Luis" }];
  }
}

// services/LoggerService.js
class LoggerService {
  log(message) {
    console.log(`[LOG]: ${message}`);
  }
}
				
			

Paso 2: Crear un Contenedor de Dependencias

Usa un objeto para centralizar las dependencias:

				
					// container.js
const UserService = require('./services/UserService');
const LoggerService = require('./services/LoggerService');

const container = {
  userService: new UserService(),
  loggerService: new LoggerService()
};

module.exports = container;

				
			

Paso 3: Inyectar Dependencias en Rutas

Configura las rutas recibiendo las dependencias necesarias:

				
					// routes/userRoutes.js
const express = require('express');
const router = express.Router();

module.exports = (dependencies) => {
  const { userService, loggerService } = dependencies;

  router.get('/users', (req, res) => {
    loggerService.log('Fetching users...');
    const users = userService.getAll();
    res.json(users);
  });

  return router;
};
				
			

Paso 4: Inicializar la Aplicación

Conecta todo en tu archivo principal:

				
					// app.js
const express = require('express');
const container = require('./container');
const userRoutes = require('./routes/userRoutes');

const app = express();

// Inyección explícita de dependencias
app.use('/api', userRoutes(container)); 

app.listen(3000, () => {
  console.log('Servidor en http://localhost:3000');
});
				
			

Uso Avanzado: Containers de DI Profesionales

Para proyectos complejos, usa bibliotecas como Awilix:

				
					// Instalación
npm install awilix  

// Configuración
const { createContainer, asClass } = require('awilix');
const container = createContainer();

container.register({
  userService: asClass(UserService).singleton(),
  loggerService: asClass(LoggerService).singleton()
});

// Resolución en rutas
router.get('/users', (req, res) => {
  const userService = container.resolve('userService');
  // ... lógica ...
});
				
			

Tabla Comparativa: Con DI vs Sin DI

CaracterísticaCon Inyección de DependenciasSin Inyección de Dependencias
AcoplamientoBajoAlto
TestabilidadFácil (mocks)Compleja
EscalabilidadAltaLimitada
MantenimientoSimplificadoCostoso
 

Conclusión

La inyección de dependencias transforma la manera en que estructuras aplicaciones Express, haciendo tu código más limpio y profesional. ¡Empieza a aplicarla en tus próximos proyectos!

Links de referencia:

Facebook
X
LinkedIn
Reddit
Pinterest
Threads

Post relacionados

Post recientes

Search