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



Dans le développement moderne sur Node.js, la propreté de l'architecture et la testabilité du code deviennent primordiales. L'un des outils clés pour atteindre ces objectifs est l'injection de dépendances (Dependency Injection, DI). La bibliothèque Awilix fournit un conteneur DI puissant, performant et flexible pour JavaScript et TypeScript, idéal pour les applications serveur sur Node.js. Dans cet article, nous allons détailler comment utiliser Awilix pour gérer les dépendances, améliorer la modularité et simplifier les tests.



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



L'injection de dépendances est un modèle de conception dans lequel un objet reçoit ses dépendances de l'extérieur, plutôt que de les créer lui-même. Cela implémente le principe d'Inversion de Contrôle (IoC). Un conteneur est un outil qui automatise le processus de création et de fourniture de ces dépendances. Au lieu de créer manuellement des instances de classes et de les passer les unes aux autres, vous décrivez les règles d'assemblage dans le conteneur, et il résout lui-même toutes les chaînes de dépendances.



Les principaux avantages de l'utilisation d'un conteneur DI :

  • Réduction du couplage du code : Les modules dépendent d'abstractions, et non d'implémentations concrètes.
  • Simplification des tests : Il est facile de remplacer les services réels par des mocks lors des tests unitaires.
  • Gestion centralisée : Toute la configuration des dépendances se trouve à un seul endroit, ce qui simplifie le refactoring.
  • Gestion du cycle de vie : Le conteneur peut contrôler la durée de vie d'un objet — une seule instance pour toute l'application (singleton) ou une nouvelle à chaque requête.


Installation d'Awilix



Pour commencer, installez la bibliothèque via npm :

npm install awilix


Awilix n'a pas de dépendances externes et fonctionne aussi bien avec les modules CommonJS qu'ESM.



Concepts clés d'Awilix



Awilix repose sur plusieurs notions clés :

  • Container (conteneur) : L'objet principal qui stocke et fournit les dépendances.
  • Registration (enregistrement) : Le processus de liaison d'un nom (token) à une fabrique, une classe ou une valeur.
  • Resolver (résolveur) : Un objet qui détermine comment créer ou obtenir une dépendance. Par exemple, asClass(), asFunction(), asValue().
  • Lifetime (durée de vie) : Indique combien de fois l'objet sera créé : ScopedLifeTime (une fois par scope), SingletonLifeTime (une fois pour toute la durée) ou TransientLifeTime (nouveau à chaque fois).


Exemple d'utilisation : service de gestion des utilisateurs



Prenons un exemple simple. Supposons que nous ayons une base de données, un dépôt d'utilisateurs et un service pour la logique métier.



1. Définition des classes

// database.jsclass Database {    constructor() {        this.connection = 'Connecté à la DB';    }    query(sql) {        return `Résultat pour : ${sql}`;    }}

// userRepository.jsclass UserRepository { constructor({ database }) { this.db = database; } findById(id) { return this.db.query(`SELECT * FROM users WHERE id = ${id}`); }}

// userService.jsclass UserService { constructor({ userRepository }) { this.repo = userRepository; } getUser(id) { return this.repo.findById(id); }}


Notez les constructeurs : ils acceptent un objet avec les dépendances. C'est une pratique standard pour Awilix.



2. Configuration du conteneur

const { createContainer, asClass, asValue, Lifetime } = require('awilix');

const container = createContainer();

// Enregistrement de

Recommendations