codecamp

NestJS 循环依赖

当两个类互相依赖时就会出现循环依赖. 例如,当 A 类需要 B 类,而 B 类也需要 A 类时,就会产生循环依赖。Nest 允许在提供者( provider )和模块( module )之间创建循环依赖关系.

建议尽可能避免循环依赖。但是有时候难以避免,Nest提供了两个方法来解决这个问题.本章中我们提供了两种技术,即正向引用(forward reference)和模块引用(ModuleRef)来从注入容器中获取一个提供者。

我们也讨论了在模块间处理循环依赖的问题。

循环依赖也可以使用封装桶文件/index.ts文件成组导入。桶(Barrel)文件应该从模块/类中省略掉。例如,当在同一个目录下作为桶文件导入时不应使用桶文件,例如,cats/cats.controller不应该导入cat到cats/cats.service文件。更多内容参见github issue

前向引用

前向引用允许 Nest 引用目前尚未被定义的引用。当CatsService 和 CommonService 相互依赖时,关系的双方都需要使用 @Inject() 和 forwardRef() ,否则 Nest 不会实例化它们,因为所有基本元数据都不可用。让我们看看下面的代码片段:

cats.service.ts
@Injectable()
export class CatsService {
  constructor(
    @Inject(forwardRef(() => CommonService))
    private readonly commonService: CommonService,
  ) {}
}

forwardRef() 需要从 @nestjs/common 包中导入的。

这只是关系的一方面。现在让我们对 CommonService 做同样的事情:

common.service.ts
@Injectable()
export class CommonService {
  constructor(
    @Inject(forwardRef(() => CatsService))
    private readonly catsService: CatsService,
  ) {}
}

实例化的顺序是不确定的。不能保证哪个构造函数会被先调用。

可选的模块引用(ModuleRef)类

一个选择是使用forwardRef()来重构你的代码,并使用ModuleRef类来在循环引用关系一侧获取提供者。更多关于ModuleRef类的内容参考这里

模块前向引用

为了处理模块( module )之间的循环依赖,必须在模块关联的两个部分上使用相同的 forwardRef():

common.module.ts
@Module({
  imports: [forwardRef(() => CatsModule)],
})
export class CommonModule {}


NestJS 注入作用域
NestJS 模块参考
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }