use*_*236 8 javascript dependency-injection module nestjs
我正在努力弄清楚如何从 DynamicModule 向常规模块提供服务。伪代码如下:
应用程序模块.ts
@Global()
@Module({
imports: [
DynamicModule.forRoot(config),
RegularModule,
],
providers: [],
exports: [],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
动态模块.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,
],
};
}
}
Run Code Online (Sandbox Code Playgroud)
动态服务.ts
@Injectable()
export class DynamicService {
constructor(
@Inject(CONFIG_TOKEN) private readonly config: Config,
) {}
}
Run Code Online (Sandbox Code Playgroud)
常规模块.ts
@Module({
imports: [],
providers: [RegularService, DynamicService],
exports: [RegularService],
})
export class RegularModule {}
Run Code Online (Sandbox Code Playgroud)
常规服务.ts
@Injectable()
export class RegularService {
constructor(
private readonly dynamicService: DynamicService
) {}
}
Run Code Online (Sandbox Code Playgroud)
向RegularModule提供DynamicService还需要在RegularModule中提供CONFIG_TOKEN,这看起来很奇怪并且不实用,以防更多模块依赖于DynamicService并且似乎不是正确的方法。
我缺少哪些概念以及使用 DynamicModule 服务的正确方法是什么?
DynamicModule 方法中的 forFeature 是正确的方向吗?
动态模块是需要某种上下文定义输入的模块,典型的例子是数据库模块,它至少需要主机 URL 和凭据,这会因应用程序而异。
这意味着当forRoot(input)返回时,您将拥有一个与任何常规(非动态)模块一样的模块。因此,您可以利用config动态模块服务内的值,导出动态模块上的服务,然后将该服务注入到导入动态模块的其他模块上。
无需在config注入dynamicService.
如果您需要直接访问config内部的值regularService,并且该值在多个服务和模块之间共享,那么您应该查看ConfigModule并将该config值视为 env。如果由于某些非常具体的原因它不能或不应该在 env 中,那么您仍然应该创建一个单独的模块来提供此config值。
| 归档时间: |
|
| 查看次数: |
3250 次 |
| 最近记录: |