我正在尝试做一些奇特的事情:一个根据提供者选择控制器/提供者的 DynamicModule。提供程序在 onModuleInit 处读取数据库中的配置,因此无法对其值进行硬编码。
它类似于这个问题:https://github.com/nestjs/nest/issues/601从未得到答复......
我尝试了几种方法,最接近的是:
export class FancyModule implements DynamicModule {
public module: Type<FancyModule>;
public controllers: Type<unknown>[];
public providers: Provider<unknown>[];
constructor (
@Inject(StartupConfigService) private readonly startup: StartupConfigService,
) {
this.module = FancyModule;
if (startup.featureFlagEnabled) {
this.controllers = [ FancyFeatureController ];
this.providers = [ FancyFeatureService ];
} else {
this.controllers = [ ErrorController ];
this.providers = [];
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:
应用程序模块.ts
@Module({
imports: [
StartupConfigModule.register(startupConfigOption),
FancyModule.registerAsync({
imports: [StartupConfigModule],
useFactory: function (startupConfigService: StartupConfigService) {
return startupConfigService.config
},
inject: [StartupConfigService],
}),
],
})
Run Code Online (Sandbox Code Playgroud)
fancy.module.ts
export class FancyModule {
static registerAsync (config: IAppConfig): DynamicModule {
if (config.featureFlagEnabled) {
return {
module: FancyModule,
controllers: [ FancyFeatureController ],
providers: [ FancyFeatureService ],
};
} else {
return {
module: FancyModule,
controllers: [ ],
providers: [ ],
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会按预期注入,但控制器和提供程序永远不会启动。元数据是否在构造函数之前评估?这是一个错误吗?
事实证明,我想做的事情实际上是不可能的。该方法的评估FancyModule.registerAsync()发生在 StartupconfigService(设置功能标志)的 onModuleInit 之前。DynamicModule 无法将实例化提供程序的内容用于register()自身。
其他阅读:
| 归档时间: |
|
| 查看次数: |
6535 次 |
| 最近记录: |