NestJS动态模块注册



我有一个关于动态模块导入的问题。假设我有@Injectable服务,它取决于来自配置的参数:

@Injectable()
export class StatsService {
constructor(@Inject(SERVICE_NAME) private serviceName: string) {}
...
}

假设我通过动态模块公开此服务:

@Module({})
export class CoreServicesModule {
static register(coreConfig: CoreServicesConfig): DynamicModule {
const { serviceName } = coreConfig;
return {
module: CoreServicesModule,
providers: [
{
provide: SERVICE_NAME,
useValue: serviceName
},
StatsService
],
exports: [
StatsService
]
};
}
}

假设我的应用程序相当大,并且我有很多不同的模块。但我每一个都需要StatsService

例如,为了能够在其中一个模块中使用StatsService,我需要做一些类似的事情:

@Module({
imports: [CoreServicesModule.register({ serviceName: 'test', ... })]
})
export class SomeModule { ... }

我需要为每个模块做这件事。。。我们有办法在NestJS中只做一次吗?

或者我们如何重新使用已经注册的模块?

@Global装饰器在这里也帮不了我,因为我仍然需要在每个地方导入模块。。。

如果您有兴趣在所有其他模块中使用StatService而无需导入该模块,则@Global()装饰器将为您提供帮助!

但从您的代码来看,导入CoreServicesModule的每个模块似乎也会通过动态指定它所拥有的提供者(如ValidationPipe(来对其进行小的调整
在这种情况下,您不应该将其设为@Global(),因为全局模块只应注册一次

最新更新