动态模块依赖注入

Max*_*ins 5 nestjs

我正在尝试做一些奇特的事情:一个根据提供者选择控制器/提供者的 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)

这会按预期注入,但控制器和提供程序永远不会启动。元数据是否在构造函数之前评估?这是一个错误吗?

Max*_*ins 4

事实证明,我想做的事情实际上是不可能的。该方法的评估FancyModule.registerAsync()发生在 StartupconfigService(设置功能标志)的 onModuleInit 之前。DynamicModule 无法将实例化提供程序的内容用于register()自身。

其他阅读:

基础知识 - 动态模块

高级 - 动态模块