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,
};
}
}
这使得config-module能够依赖于传入的基本配置路径。然后,我可以在主应用程序模块中导入该模块,如下所示:
@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
发布于 2019-07-25 15:00:30
最近,我构建了类似您所描述的东西,我从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
静态方法(我没有粘贴我构建的所有内容)。
发布于 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
https://stackoverflow.com/questions/53724171
复制相似问题