在线文档教程

循环依赖

循环依赖

例如,当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()方法,允许检索当前模块中可用的提供程序。此外,您可以切换到非严格模式,这样您就可以在整个应用程序中选择任何现有的提供程序。