¿Qué es Inversify y para qué sirve?
\n\nInversify es un contenedor IoC (Inversión de Control) potente y ligero para TypeScript y JavaScript. Implementa el patrón de Inyección de Dependencias (DI), que es uno de los principios clave de SOLID. Inversify permite gestionar las dependencias entre clases, haciendo que el código sea más modular, testeable y mantenible.
\n\n¿Para qué sirve? En la programación tradicional, las clases crean sus propias dependencias (por ejemplo, mediante new). Esto genera un fuerte acoplamiento en el código. Inversify invierte este proceso: las dependencias se "inyectan" desde el exterior (de ahí el nombre — Inversión de Control). El contenedor se encarga de crear y gestionar el ciclo de vida de los objetos.
Principales ventajas de usar Inversify:
\n- \n
- Bajo acoplamiento: Las clases dependen de abstracciones (interfaces), no de implementaciones concretas. \n
- Pruebas fáciles: Puedes reemplazar fácilmente las dependencias reales por mocks/stubs en las pruebas. \n
- Gestión del ciclo de vida: El contenedor puede crear objetos como singletons o nuevas instancias cada vez. \n
- Legibilidad y mantenibilidad: Todas las dependencias están declaradas explícitamente y son fáciles de rastrear. \n
- Escalabilidad: Ideal para proyectos grandes con múltiples módulos. \n
Instalación de Inversify
\n\nInversify se instala a través de npm. Para trabajar con TypeScript también necesitarás instalar reflect-metadata (biblioteca para trabajar con decoradores) y configurar tsconfig.json.
# Instalación de Inversify y reflect-metadata\nnpm install inversify reflect-metadata --save\n\n# Instalación de tipos para TypeScript (si no están instalados)\nnpm install @types/node --save-dev\n\n\nConfiguración de tsconfig.json:
\n{\n "compilerOptions": {\n "target": "ES6",\n "module": "commonjs",\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true,\n "strict": true,\n "esModuleInterop": true,\n "skipLibCheck": true,\n "forceConsistentCasingInFileNames": true,\n "outDir": "./dist",\n "rootDir": "./src",\n "types": ["reflect-metadata"]\n },\n "include": ["src/**/*"],\n "exclude": ["node_modules", "dist"]\n}\n\n\nImportante: Los decoradores @injectable() y @inject() solo funcionan con experimentalDecorators y emitDecoratorMetadata habilitados.
Inicio rápido con ejemplo de código
\n\nCreemos un ejemplo simple: un servicio para enviar notificaciones. Tendremos una interfaz INotificationService, su implementación EmailNotificationService y una clase UserService que utiliza este servicio.
// 1. Importamos los módulos necesarios\nimport "reflect-metadata";\nimport { Container, injectable, inject } from "inversify";\n\n// 2. Definimos la interfaz (abstracción)\ninterface INotificationService {\n send(message: string): void;\n}\n\n// 3. Implementación de la interfaz\n@injectable()\nclass EmailNotificationService implements INotificationService {\n send(message: string): void {\n console.log(`Enviando email: ${message}`);\n }\n}\n\n// 4. Clase que depende de INotificationService\n@injectable()\nclass UserService {\n private notificationService: INotificationService;\n\n constructor(\n @inject("INotificationService") notificationService: INotificationService\n ) {\n this.notificationService = notificationService;\n }\n\n notifyUser(userId: string): void {\n this.notificationService.send(`Notificación para el usuario ${userId}`);\n }\n}\n\n// 5. Creamos el contenedor y registramos las dependencias\nconst container = new Container();\ncontainer.bind
También en la biblioteca
Recommendations