当动态模块之间存在循环依赖时,导入动态模块的正确方法是什么?我只是更改了forwardRef(() => MyModule)
至forwardRef(() => MyModule.forRoot())
,我得到 Nest can't resolve dependencies
错误。
最佳答案
处理嵌套模块依赖关系的最好方法是始终通过模块而不是通过服务导入依赖关系。如果遇到循环依赖,nest 会显示一个错误,您可以使用 forwardRef() 轻松修复它。
假设您的应用程序有 3 个紧密耦合的模块。
和两个配套模块
此外,所有模块都在导出具有相同名称的服务。
考虑一种情况
@moduleA() imports [serviceB, serviceX]
和
@moduleB() imports [serviceA, serviceY, serviceZ]
现在在
@moduleC()
如果你想使用 serivceA() 那么你将不得不@moduleC() imports [serviceA, serviceB, serviceX, serviceY, serviceZ]
在大多数情况下,nest 会抛出正确的错误,说明在哪里缺少哪个依赖项。但有时,nest 只在 [
index
处表示依赖。 ] 丢失,nest 没有说明丢失的位置。这将导致很大程度的困惑。一种简洁的方法是始终导入模块
@moduleA() imports [moduleB, moduleX]
@moduleB() imports [moduleA, moduleY, moduleZ]
@moduleC() imports [moduleA]
如果 Nest 再次提示依赖问题,则使用
forwardRef
导入模块@module({
imports: [
forwardRef(() => ModuleA)
ModuleB
],
controllers: [],
providers: []
})
有时即使完成了所有这些操作,您也可能再次遇到依赖项不可用错误。然后你可以使用
ModuleRef
.让我们以相同的示例为例,您想在 ModuleC() 中使用 ServiceA()然后,您将在 ModuleC() 和 serviceC() 类中将 serviceA() 添加到 providers[] 中,您需要添加以下内容。
import { Injectable, OnModuleInit } from '@nestjs/common'; \\need OnModuleInit
import { ServiceA} from '../FolderA/serviceA.service';
export class ServiceC implements OnModuleInit {
private serviceA: ServiceA;
constructor(private readonly moduleRef: ModuleRef) {}
onModuleInit() {
this.serviceA= this.moduleRef.get(ServiceA);
}
foo(){
console.log(this.serviceA.someFunction())
}
}
更多详情请访问 Official documentation .
关于module - Nest.js : Circular dependencies in dynamic modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432814/