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
标记为全局标记,或者将其标记为另一种方法,那就太好了
我已经尝试使用ConfigModule
将@Global
全局化,但这没有用-这是一个基于nest new
创建的嵌套启动器的最小化示例存储库: https://github.com/DeX3/nest-di-playground
答案 0 :(得分:1)
就像@ DeX3指出的那样,您可以使用@Global
模块装饰器来实现此行为。 NestJS文档中有关模块的部分中对此进行了提及:
https://docs.nestjs.com/modules
通过查看为NestJS生态系统构建的一些第三方模块(如TypeOrm软件包),您可以查看实际操作中更深入/更真实的示例:
https://github.com/nestjs/typeorm/blob/master/lib/typeorm-core.module.ts
答案 1 :(得分:0)
最近我建立了类似您所描述的内容,我从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],
};
}
}
然后,您将在LoggerService
导出的全局范围内有一个LoggerCoreModule
。您不必导出通过的配置,但是我这样做了,因为我的非核心模块有一个forFeature
静态方法需要它(我没有粘贴我构建的全部内容)。
答案 2 :(得分:-1)
您忘记了在@Injectable
中使用/src/config/Config.ts
装饰器。
import { Injectable } from '../../node_modules/@nestjs/common';
export class Config {
config1: string;
config2: number;
path: string;
}
应该是
import { Injectable } from '../../node_modules/@nestjs/common';
@Injectable() // <-----------------------
export class Config {
config1: string;
config2: number;
path: string;
}