🔹 NestJS

Circular dependency, Lazy-loading modules, LifeCycle Events, Execution Context

Résoudre les boucles

Optimiser le démarrage

📌 Dépendances Circulaires

Une dépendance circulaire se produit lorsque deux modules ou services dépendent l'un de l'autre :

Module A a besoin de Module B

Module B a besoin de Module A

❌ Cela crée une boucle infinie sans solution !

Erreur: Nest can't resolve dependencies of the UsersService (?)

✅ Solution : forwardRef()

NestJS propose forwardRef() pour résoudre les boucles :

Dans les modules :

imports: [forwardRef(() => RolesModule)]

Dans les services :

constructor(
  @Inject(forwardRef(() => RolesService))
  private rolesService: RolesService,
) {}

✓ NestJS crée d'abord tous les modules, puis lie les services

💡 Exemple : Users ↔ Roles

users.service.ts

@Injectable()
export class UsersService {
  constructor(
    @Inject(forwardRef(() => RolesService))
    private rolesService: RolesService,
  ) {}
}

roles.service.ts

@Injectable()
export class RolesService {
  constructor(
    @Inject(forwardRef(() => UsersService))
    private usersService: UsersService,
  ) {}
}

🚀 Lazy-loading Modules

Le Lazy-loading permet de charger un module seulement lorsqu'il est nécessaire :

❌ Sans Lazy-loading

  • • Tous les modules créés au démarrage
  • • Temps de démarrage long
  • • Mémoire élevée

✅ Avec Lazy-loading

  • • Module créé à la demande
  • • Démarrage rapide
  • • Mémoire optimisée

💪 Solution : ModuleRef.resolve()

Charger un service à la demande avec ModuleRef.resolve() :

async getReportsService() {
  const reportsService = await
    this.moduleRef.resolve(ReportsService);
  return reportsService;
}

Singleton maintenu après le premier chargement

✓ Module créé seulement au premier appel

🎯 Exemple : 3 Modules

UsersModule (chargé normalement)

ReportsModule & AnalyticsModule (lazy)

@Get('report')
async report() {
  const svc = await this.moduleRef.resolve(ReportsService);
  return svc.generate();
}

@Get('analytics')
async analytics() {
  const svc = await this.moduleRef.resolve(AnalyticsService);
  return svc.analyze();
}

✓ Chargement à la demande | ✓ Démarrage optimisé

1 / 7