gpt4 book ai didi

javascript - NestJS - 如何提供动态模块的服务

转载 作者:行者123 更新时间:2023-12-05 00:27:50 28 4
gpt4 key购买 nike

我正在努力弄清楚如何提供从 DynamicModule 到常规模块的服务。伪代码如下:
app.module.ts

@Global()
@Module({
imports: [
DynamicModule.forRoot(config),
RegularModule,
],
providers: [],
exports: [],
})
export class AppModule {}
动态模块.ts
@Module({})
export class DynamicModule implements OnModuleInit, OnModuleDestroy {
constructor(private dynamicService: dynamicService) {}

static forRoot(config: Config): DynamicModule {
return {
module: DynamicModule,
imports: [],
providers: [
{
provide: CONFIG_TOKEN,
useValue: config,
},
DynamicService,
],
exports: [
DynamicService,
],
};
}
}
动态服务.ts
@Injectable()
export class DynamicService {

constructor(
@Inject(CONFIG_TOKEN) private readonly config: Config,
) {}
}
常规模块.ts
@Module({
imports: [],
providers: [RegularService, DynamicService],
exports: [RegularService],
})
export class RegularModule {}
常规服务.ts
@Injectable()
export class RegularService {

constructor(
private readonly dynamicService: DynamicService
) {}
}
向RegularModule 提供DynamicService 还需要在RegularModule 中提供CONFIG_TOKEN,如果更多模块依赖于DynamicService 并且似乎不是正确的方法,这似乎很奇怪且不实用。
我缺少什么概念以及使用 DynamicModule 服务的正确方法是什么?
DynamicModule 方法中的 forFeature 会是正确的方向吗?

最佳答案

动态模块是需要某种上下文定义输入的模块,经典示例是一个数据库模块,它至少需要主机 url 和凭据,这会因应用程序而异。
这意味着当 forRoot(input)返回,您有一个模块,就像任何常规(非动态)模块一样。因此,您可以使用 config动态模块服务中的值,在动态模块上导出服务,然后将该服务注入(inject)到导入动态模块的其他模块上。
无需同时注入(inject) config注入(inject) dynamicService 的服务的值.

如果您需要直接访问 config regularService 中的值,并且该值在多个服务和模块之间共享,那么您应该查看 ConfigModule并对待它config环境值。如果由于某些非常具体的原因它不能或不应该在 env 中,那么你仍然应该创建一个单独的模块来提供这个 config值(value)观。

关于javascript - NestJS - 如何提供动态模块的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65991182/

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