Conteneur d'injection de dépendances pour JavaScript (Node.js) : Awilix

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

Conteneur d'injection de dépendances pour JavaScript (Node.js) : Awilix

\n\n

Dans le développement moderne avec Node.js, maintenir une architecture propre et la testabilité du code est crucial. L'un des modèles clés qui y contribue est l'injection de dépendances (DI). Pour implémenter efficacement ce modèle dans l'environnement JavaScript, des bibliothèques spécialisées ont été créées : les conteneurs d'injection de dépendances. Dans cet article, nous examinerons en détail l'une des bibliothèques les plus populaires et légères : Awilix.

\n\n

Qu'est-ce que l'injection de dépendances et pourquoi un conteneur est-il nécessaire ?

\n\n

Dans l'approche traditionnelle, un objet crée lui-même ses dépendances (par exemple, avec l'opérateur new). Cela entraîne un fort couplage du code, ce qui complique les tests et la modification. Le modèle d'injection de dépendances propose de transmettre (injecter) les dépendances de l'extérieur. Le conteneur automatise ce processus : il sait comment créer les objets et leurs dépendances, et fournit des instances prêtes à l'emploi sur demande.

\n\n

Awilix : un conteneur DI léger et puissant

\n\n

Awilix est une bibliothèque pour JavaScript (Node.js) qui implémente le modèle d'inversion de contrôle (IoC) à l'aide d'un conteneur. Elle a été écrite de zéro pour Node.js, prend en charge la résolution asynchrone des dépendances, différents styles d'enregistrement (classes, fabriques, valeurs) et la détection automatique des dépendances via le constructeur.

\n\n

Fonctionnalités principales :

\n
    \n
  • Injection automatique : Le conteneur analyse les paramètres du constructeur ou de la fonction et injecte automatiquement les dépendances nécessaires.
  • \n
  • Prise en charge de l'asynchrone : Les dépendances peuvent être asynchrones (par exemple, une connexion à une base de données), et le conteneur attend correctement leur résolution.
  • \n
  • Différents modes d'enregistrement : Vous pouvez enregistrer des classes (asClass), des fonctions de fabrique (asFunction) ou des valeurs prêtes à l'emploi (asValue).
  • \n
  • Portées (Scopes) : Différents cycles de vie des objets sont pris en charge (singleton, transient, scoped).
  • \n
  • Modularité : Le conteneur peut être facilement divisé en modules et les dépendances peuvent être enregistrées dans différentes parties de l'application.
  • \n
\n\n

Installation et utilisation de base

\n\n

L'installation d'Awilix se fait via npm :

\n\n
npm install awilix
\n\n

Prenons un exemple simple. Supposons que nous ayons un service pour travailler avec les utilisateurs, qui dépend d'un logger et d'un repository.

\n\n
const { createContainer, asClass, asFunction, asValue } = require('awilix');\n\n// 1. Définir les dépendances\nclass Logger {\n    log(message) {\n        console.log(`[LOG]: ${message}`);\n    }\n}\n\nclass UserRepository {\n    constructor({ logger }) {\n        this.logger = logger;\n    }\n\n    findById(id) {\n        this.logger.log(`Recherche de l'utilisateur avec l'ID : ${id}`);\n        return { id, name: 'John Doe' };\n    }\n}\n\nclass UserService {\n    constructor({ userRepository, logger }) {\n        this.userRepository = userRepository;\n        this.logger = logger;\n    }\n\n    getUser(id) {\n        this.logger.log('Requête dans UserService');\n        return this.userRepository.findById(id);\n    }\n}\n\n// 2. Créer le conteneur et enregistrer les dépendances\nconst container = createContainer();\n\ncontainer.register({\n    logger: asClass(Logger).singleton(),\n    userRepository: asClass(UserRepository).singleton(),\n    userService: asClass(UserService).singleton()\n});\n\n// 3. Utiliser le conteneur pour obtenir le service\nconst userService = container.resolve('userService');\nconst user = userService.getUser(1);\nconsole.log(user);\n// Sortie :\n// [LOG]: Requête dans UserService\n// [LOG]: Recherche de l'utilisateur avec l'ID : 1\n// { id: 1, name: 'John Doe' }\n<                    

Recommendations