InversifyJS : Un puissant conteneur IoC pour TypeScript
\n\nInversifyJS est un conteneur IoC (Inversion de Contrôle) léger mais extrêmement puissant pour les applications TypeScript et JavaScript. Il implémente le modèle Dependency Injection (DI), permettant aux développeurs de créer des systèmes faiblement couplés, testables et évolutifs. La bibliothèque exploite activement les fonctionnalités de TypeScript (décorateurs, types) pour garantir un typage strict et une facilité de développement.
\n\nInversifyJS est idéal pour les applications serveur Node.js, ainsi que pour les projets clients utilisant des frameworks comme Angular, React ou Vue. Dans cet aperçu, nous allons détailler les concepts clés et montrer comment commencer rapidement.
\n\nConcepts fondamentaux d'InversifyJS
\n\nAvant d'écrire du code, il est important de comprendre les trois entités principales de la bibliothèque :
\n\n- \n
- Conteneur (Container) — l'objet central qui gère toutes les dépendances. Vous y enregistrez les abstractions et leurs implémentations. \n
- Identifiants de service (Service Identifiers) — des clés uniques permettant au conteneur de trouver l'implémentation appropriée. Ils peuvent être des chaînes, des symboles ou des classes. \n
- Décorateurs —
@injectable()et@inject()— indiquent à TypeScript qu'une classe peut être injectée et quelles dépendances elle nécessite. \n
Installation et configuration
\n\nPour commencer, installez InversifyJS et ses dépendances typographiques :
\n\nnpm install inversify reflect-metadata --save\nnpm install --save-dev @types/node\n\nAjoutez ensuite deux options obligatoires dans tsconfig.json :
{\n "compilerOptions": {\n "emitDecoratorMetadata": true,\n "experimentalDecorators": true,\n "types": ["reflect-metadata"]\n }\n}\n\nAprès cela, importez reflect-metadata dans le fichier principal de l'application (généralement index.ts ou main.ts) :
import "reflect-metadata";\n\nPremier exemple : un service simple
\n\nCréons une interface et son implémentation. Notez le décorateur @injectable() :
// interfaces/IWarrior.ts\nexport interface IWarrior {\n fight(): string;\n}\n\n// entities/Warrior.ts\nimport { injectable } from "inversify";\n\n@injectable()\nexport class Warrior implements IWarrior {\n fight(): string {\n return "Warrior attacks with sword!";\n }\n}\n\nEnregistrons maintenant cette liaison dans le conteneur et obtenons une instance :
\n\nimport { Container } from "inversify";\nimport { IWarrior } from "./interfaces/IWarrior";\nimport { Warrior } from "./entities/Warrior";\n\nconst container = new Container();\n\n// Enregistrer l'abstraction avec son implémentation\ncontainer.bind<IWarrior>("IWarrior").to(Warrior);\n\n// Obtenir une instance\nconst warrior = container.get<IWarrior>("IWarrior");\nconsole.log(warrior.fight()); // "Warrior attacks with sword!"\n\nInjection de dépendances via le constructeur
\n\nLa véritable puissance de la DI se révèle lorsqu'une classe dépend d'une autre. Utilisons le décorateur @inject() :
// interfaces/IWeapon.ts\nexport interface IWeapon {\n use(): string;\n}\n\n// entities/Sword.ts\nimport { injectable } from "inversify";\n\n@injectable()\nexport class Sword implements IWeapon {\n use(): string {\n return "Swing sword!";\n }\n}\n\n// entities/Knight.ts\nimport { injectable, inject } from "inversify";\nimport { IWarrior } from "../interfaces/IWarrior";\nimport { IWeapon } from "../interfaces/IWeapon";\n\n@injectable()\nexport class Knight implements IWarrior {\n private _weapon: IWeapon;\n\n constructor(@inject("IWeapon") weapon: IWeapon) {\n this._weapon = weapon;\n }\n\n fight(): string {\n return this._weapon.use() + " The knight fights!";\n }\n}\n\nEnregistre
Aussi dans la bibliothèque
Cobra pour Go : guide complet avec exemples
Travail avec les images en Swift : redimensionnement, recadrage (iOS/macOS)
Bibliothèques WebSocket Java : Guide complet pour l'implémentation en temps réel
Planificateur de tâches en TypeScript : guide détaillé de la bibliothèque node-schedule