动态模块依赖注入

时间:2020-10-06 22:46:07

标签: nestjs

我正在尝试做一些花哨的事情:一个DynamicModule,它根据提供程序选择一个Controller / Providers。提供程序在onModuleInit读取数据库中的配置,因此无法对其值进行硬编码。

类似于以下问题:https://github.com/nestjs/nest/issues/601从未得到回答...

我尝试了几种方法,而最接近的方法是:

   Song Type
1     1    1
2     2    1
3    3A   NA
4    9C   NA
5     6    1
6     5   NA
7   12B   NA
8   32A    1
9    18   NA
10   27   NA
11   24   NA
12   1D    1

第二种方法:

app.module.ts

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 = [];
    }
  }
}

fancy.module.ts

@Module({
  imports: [
    StartupConfigModule.register(startupConfigOption),
    FancyModule.registerAsync({
      imports: [StartupConfigModule],
      useFactory: function (startupConfigService: StartupConfigService) {
           return startupConfigService.config
      },
      inject: [StartupConfigService],
   }),
 ],
})

这将按预期进行注入,但是控制器和提供程序永远不会旋转。元数据是在构造函数之前评估的吗?那是个错误吗?

1 个答案:

答案 0 :(得分:0)

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

其他阅读内容:

Fundamentals - Dynamic Modules

Advanced - Dynamic Modules