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



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

app.module.ts

@Global()
@Module({
imports: [
DynamicModule.forRoot(config),
RegularModule,
],
providers: [],
exports: [],
})
export class AppModule {}

dynamic.module.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,
],
};
}
}

dynamic.service.ts

@Injectable()
export class DynamicService {
constructor(
@Inject(CONFIG_TOKEN) private readonly config: Config,
) {}
}

regular.module.ts

@Module({
imports: [],
providers: [RegularService, DynamicService],
exports: [RegularService],
})
export class RegularModule {}

regular.service.ts

@Injectable()
export class RegularService {
constructor(
private readonly dynamicService: DynamicService
) {}
}

向RegularModule提供DynamicService需要在RegularModule中提供CONFIG_TOKEN,这似乎很奇怪,也不实用,因为更多的模块将依赖于DynamicService,并且似乎不是正确的方式。

我遗漏了什么概念,使用DynamicModule的服务的正确方法是什么?

在DynamicModule方法中的forFeature会是正确的方向吗?


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

如果您需要直接访问regularService内部的config值,并且该值在多个服务和模块之间共享,那么您应该查看ConfigModule并将config值视为env。如果由于某些非常特殊的原因,它不能或不应该在env中,那么您仍然应该创建一个单独的模块来提供这些config值。

最新更新