InversifyJS : conteneur IoC pour applications TypeScript

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

InversifyJS : Un puissant conteneur IoC pour TypeScript

\n\n

InversifyJS 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\n

InversifyJS 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\n

Concepts fondamentaux d'InversifyJS

\n\n

Avant 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
\n\n

Installation et configuration

\n\n

Pour commencer, installez InversifyJS et ses dépendances typographiques :

\n\n
npm install inversify reflect-metadata --save\nnpm install --save-dev @types/node
\n\n

Ajoutez ensuite deux options obligatoires dans tsconfig.json :

\n\n
{\n  "compilerOptions": {\n    "emitDecoratorMetadata": true,\n    "experimentalDecorators": true,\n    "types": ["reflect-metadata"]\n  }\n}
\n\n

Après cela, importez reflect-metadata dans le fichier principal de l'application (généralement index.ts ou main.ts) :

\n\n
import "reflect-metadata";
\n\n

Premier exemple : un service simple

\n\n

Créons une interface et son implémentation. Notez le décorateur @injectable() :

\n\n
// 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\n

Enregistrons maintenant cette liaison dans le conteneur et obtenons une instance :

\n\n
import { 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\n

Injection de dépendances via le constructeur

\n\n

La véritable puissance de la DI se révèle lorsqu'une classe dépend d'une autre. Utilisons le décorateur @inject() :

\n\n
// 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\n

Enregistre

Recommendations