循环依赖
循环依赖
例如,当A类需要B类时,循环依赖
性发生,而B类也需要A类。Nest允许在提供者和模块之间创建循环依赖
关系,但我们建议您尽可能避免。有时候很难避免这种关系,这就是为什么我们提供了一些方法来处理这个问题。
前向参考
该向前参考
允许Nest
引用目前尚未被定义的引用。当彼此依赖CatsService
并且CommonService
相互依赖时,关系的两侧都需要使用@Inject()
和forwardRef()
实用程序,否则Nest
将不会实例化它们,因为所有必需的元数据都不可用。我们来看看以下代码段:
cats.service.ts
JS
@Injectable()
export class CatsService {
constructor(
@Inject(forwardRef(() => CommonService))
private readonly commonService: CommonService,
) {}
}
提示
该forwardRef()
功能从@nestjs/common
包中导入。
这是这段关系的第一面。现在让我们做同样的事情CommonService
:
common.service.ts
JS
@Injectable()
export class CommonService {
constructor(
@Inject(forwardRef(() => CatsService))
private readonly catsService: CatsService,
) {}
}
警告
您无法保证首先调用哪个构造函数。
为了在模块之间创建循环依赖关系,您必须forwardRef()
在模块关联的两个部分上使用相同的实用程序:
common.module.ts
JS
@Module{
imports: [forwardRef(() => CatsModule)],
})
export class CommonModule {}
模块参考
Nest提供了ModuleRef
可以简单地注入任何组件的类。
cats.service.ts
JS
@Injectable()
export class CatsService implements OnModuleInit {
private service: Service;
constructor(private readonly moduleRef: ModuleRef) {}
onModuleInit() {
this.service = this.moduleRef.get(Service
}
}
提示
的ModuleRef
类是从进口@nestjs/core
包。
模块引用有一个get()
方法,允许检索当前模块中可用的提供程序。此外,您可以切换到非严格模式,这样您就可以在整个应用程序中选择任何现有的提供程序。