我有一个动态模块EmailModule:
@Injectable()
export class EmailSender {}
@Module({})
export class EmailModule {
static forRoot(options: { smtpHost: string; smtpPassword: string }): DynamicModule {
return {
module: EmailModule,
providers: [EmailSender,],
exports: [EmailSender,],
};
}
}
还有MainModule,它包含CatModule.
@Injectable()
export class CatService {
constructor(emailSender: EmailSender) {}
}
@Module({
imports: [
EmailModule,
],
providers: [CatService,],
exports: [CatService,],
})
export class CatModule {}
@Module({
imports: [
EmailModule.forRoot({
smtpHost: 'localhost',
smtpPassword: 'password',
}),
CatModule,
],
})
export class MainModule {}
此代码不起作用,因为CatService无法解析EmailSender.我必须在CatModule中导入EmailModule.forRoot({host, password})
.
然而,我不想这样做.想象一下,我有DogModule、HorseModule、BirdModule、CowModule.我不想写这个长版本,到处都是.forRoot({...})
个.我正在寻找一种解决方案,允许我在主模块中使用.forRoot({...})
,并在所有子模块中简单地导入EmailModule
.
我确信这是可能的,因为这正是nestjs ConfigModule的工作方式.如果我用ConfigModule替换EmailModule,一切都会正常工作!
@Injectable()
export class CatService {
constructor(configService: ConfigService) {}
}
@Module({
imports: [
ConfigModule,
],
providers: [CatService,],
exports: [CatService,],
})
export class CatModule {}
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '../.env',
}),
CatModule,
],
})
export class MainModule {}
我不明白为什么它可以与ConfigModule一起工作,但不能与EmailModule一起工作.这个模块有什么特别之处?