Module 03
⭐⭐⭐ Difficile
~3h
🏗️ App Blog — Architecture Modulaire
Architecturer une application blog complète en modules bien découplés : CoreModule, UsersModule, PostsModule, CommentsModule, MailModule. Maîtriser imports, exports et DI avancée.
🏛️ Architecture cible
AppModule
├── CoreModule (@Global) — Logger, Config
├── UsersModule — exports: UsersService
│ └── imports: MailModule
├── PostsModule — imports: UsersModule
│ └── imports: CommentsModule (re-export)
├── CommentsModule — imports: UsersModule, PostsModule (forwardRef)
└── MailModule (DynamicModule.register()) — exports: MailService
🔧 Code de démarrage
// mail.module.ts — module dynamique
@Module({})
export class MailModule {
static register(options: { from: string; transport: string }): DynamicModule {
return {
module: MailModule,
providers: [
{ provide: 'MAIL_OPTIONS', useValue: options },
MailService,
],
exports: [MailService],
};
}
}
// core.module.ts — module global
@Global()
@Module({
providers: [LoggerService, AppConfigService],
exports: [LoggerService, AppConfigService],
})
export class CoreModule {}
// app.module.ts — assemblage
@Module({
imports: [
CoreModule,
MailModule.register({ from: 'noreply@blog.com', transport: process.env.SMTP_URL }),
UsersModule,
PostsModule,
CommentsModule,
],
})
export class AppModule {}
✅ Fonctionnalités
- CRUD Posts : create, findAll, findOne, update, delete
- Comments par post (relation imbriquée)
- Email de bienvenue à l'inscription (via MailService)
- LoggerService global pour tracer toutes les opérations
- Résoudre la dépendance circulaire Posts ↔ Comments avec forwardRef()