首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >nestjs:动态全局模块

nestjs:动态全局模块
EN

Stack Overflow用户
提问于 2018-12-11 20:23:45
回答 2查看 7K关注 0票数 5

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

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

代码语言:javascript
复制
export class ConfigModule {
    static forRoot(baseConfigPath: string): DynamicModule {
        const providers = [{ provide: 'Config', useValue: configFactory(baseConfigPath) }];

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

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

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

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

我已经尝试过用@Global创建全局ConfigModule,但没有成功--这是一个基于nest new创建的nest starter的超小型简化示例存储库:https://github.com/DeX3/nest-di-playground

EN

回答 2

Stack Overflow用户

发布于 2019-07-25 15:00:30

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

代码语言:javascript
复制
@Module({})
export class LoggerModule {
  static forRoot(rootNamespace: string): DynamicModule {
    return {
      module: LoggerModule,
      imports: [LoggerCoreModule.forRoot(rootNamespace)],
    };
  }
}
代码语言:javascript
复制
@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静态方法(我没有粘贴我构建的所有内容)。

票数 6
EN

Stack Overflow用户

发布于 2018-12-12 09:08:35

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

https://docs.nestjs.com/modules

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53724171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档