Senior #dynamic-module#forRoot#config#global-module
Dynamic module: forRoot, forRootAsync, ConfigModule; global vs scoped module
⚡ Trả lời nhanh
Dynamic module là module có static method (forRoot/register/forRootAsync) trả về DynamicModule với providers theo cấu hình. forRootAsync nhận useFactory + inject để lấy config bất đồng bộ (vd. từ ConfigService). @Global() làm export khả dụng mọi nơi không cần import.
@Module({})
export class MailModule {
static forRootAsync(opts: {
imports?: any[]; inject?: any[];
useFactory: (...a: any[]) => MailOptions | Promise<MailOptions>;
}): DynamicModule {
return {
module: MailModule,
imports: opts.imports ?? [],
providers: [
{ provide: MAIL_OPTIONS, useFactory: opts.useFactory, inject: opts.inject ?? [] },
MailService,
],
exports: [MailService],
};
}
}
// MailModule.forRootAsync(...) với inject: [ConfigService]
ConfigModule.forRoot()với tùy chọnisGlobal: truenạp.envvà validate; đặt global để khỏi import lại ở mọi module.- Quy ước:
forRootcấu hình một lần cho app,registercấu hình riêng theo từng nơi import,forFeatuređăng ký phần riêng (vd. entity).