gpt4 book ai didi

typescript - nestjs:动态全局模块

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:34 26 4
gpt4 key购买 nike

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 模块的兄弟模块),我也希望动态配置模块的同一个实例是可注入(inject)的。如果我能以某种方式将动态 ConfigModule 标记为全局的,那就太好了——或者还有其他方法吗?

我已经尝试使用 @Global 使 ConfigModule 成为全局的,但这没有用 - 这是一个基于创建的 nest starter 的 super 最小简化示例 repo来自 nest new:https://github.com/DeX3/nest-di-playground

最佳答案

最近我构建了一些类似你所描述的东西,我从 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 静态方法(我没有粘贴我构建的整个东西)。

关于typescript - nestjs:动态全局模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53724171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com