Résoudre les boucles
Optimiser le démarrage
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 (?)
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
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,
) {}
}
Le Lazy-loading permet de charger un module seulement lorsqu'il est nécessaire :
❌ Sans Lazy-loading
✅ Avec Lazy-loading
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
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é