【问题标题】:nestjs: dynamic global modulenestjs:动态全局模块
【发布时间】:2019-05-12 10:41:20
【问题描述】:

official nest docs on modules 解释了全局模块和动态模块。我想知道是否可以将这两种模式结合起来?

我的用例如下:我有一个动态配置模块:

export class ConfigModule {
    static forRoot(baseConfigPath: string): DynamicModule {
        const providers = [{ provide: 'Config', useValue: configFactory(baseConfigPath) }];

        return {
            module: ConfigModule,
            providers,
            exports: providers,
        };
    }
}

这使配置模块能够依赖于传入的基本配置路径。然后我可以在主应用模块中导入模块,如下所示:

@Module({
    imports: [ConfigModule.forRoot(path.resolve(__dirname, '../config'))],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule implements NestModule {}

这有点好。但是,我确实有很多其他模块(app 模块的子模块,config 模块的兄弟模块),我还希望动态配置模块的同一个实例是可注入的。如果我能以某种方式将动态 ConfigModule 标记为全局,那就太好了 - 还是有其他方法?

我已经尝试使用@GlobalConfigModule 设为全局,但这不起作用 - 这是一个基于nest new 创建的嵌套启动器的超级最小简化示例存储库:https://github.com/DeX3/nest-di-playground

【问题讨论】:

  • 你试过用@GlobalConfigModule 设为全局吗?
  • 是的,我确实尝试过,但无法成功。我已经更新了我的问题以包含一个最小的示例。

标签: typescript nestjs


【解决方案1】:

就像@DeX3 指出的那样,您可以使用@Global 模块装饰器来实现此行为。 NestJS 文档中关于模块的部分提到了这一点:

https://docs.nestjs.com/modules

您可以通过查看为 NestJS 生态系统构建的一些第三方模块(如 TypeOrm 包)来查看更深入/真实世界的示例:

https://github.com/nestjs/typeorm/blob/master/lib/typeorm-core.module.ts

【讨论】:

  • 我是这个问题的作者;)我尝试将模块设为全局,但它似乎不起作用。我整理了一个最小的破坏演示并编辑了我的问题。
【解决方案2】:

最近我构建了类似你所描述的东西,我从nest/typeorm得到了灵感

@Module({})
export class LoggerModule {
  static forRoot(rootNamespace: string): DynamicModule {
    return {
      module: LoggerModule,
      imports: [LoggerCoreModule.forRoot(rootNamespace)],
    };
  }
}
@Global()
@Module({})
export class LoggerCoreModule {
  static forRoot(rootNamespace: string): DynamicModule {
    const namespaceProvider = {
      provide: LOGGER_ROOT_NAMESPACE,
      useValue: rootNamespace,
    };

    const loggerServiceProvider: Provider = {
      provide: LoggerService,
      useFactory: (namespace) => new LoggerService(namespace).init(),
      inject: [LOGGER_ROOT_NAMESPACE],
    };

    return {
      module: LoggerCoreModule,
      providers: [loggerServiceProvider, namespaceProvider],
      exports: [loggerServiceProvider, namespaceProvider],
    };
  }
}

然后,您将在从LoggerCoreModule 导出的全局范围内拥有一个LoggerService。您不必导出您传递的配置,但我这样做了,因为我的非核心模块有一个需要它的 forFeature 静态方法(我没有粘贴我构建的整个东西)。

【讨论】:

  • 您能否分享一个上述实现的示例。谢谢
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2019-08-20
  • 2021-01-27
  • 2022-12-20
相关资源
最近更新 更多