forwardRef
是 NestJS 提供的一个实用函数,用于处理模块或提供者之间的循环依赖问题。它允许 NestJS 解决那些原本会创建循环引用的依赖关系,这类循环引用通常会导致初始化错误。
forwardRef
用于延迟依赖关系的评估。当两个模块相互依赖时:
// module-a.module.ts
@Module({
imports: [forwardRef(() => ModuleB)],
})
export class ModuleA {}
// module-b.module.ts
@Module({
imports: [forwardRef(() => ModuleA)],
})
export class ModuleB {}
当两个服务相互依赖时:
// service-a.service.ts
@Injectable()
export class ServiceA {
constructor(
@Inject(forwardRef(() => ServiceB))
private serviceB: ServiceB
) {}
}
// service-b.service.ts
@Injectable()
export class ServiceB {
constructor(
@Inject(forwardRef(() => ServiceA))
private serviceA: ServiceA
) {}
}
错误信息类似:Nest can’t resolve dependencies of the XXX (…). Please make sure that the argument YYY at index [Z] is available in the XXXModule context.
@Module({
imports: [forwardRef(() => DependentModule)],
})
constructor(
@Inject(forwardRef(() => DependentService))
private dependentService: DependentService
) {}
虽然 forwardRef 是解决循环依赖的有效工具,但应该将其视为最后的手段。良好的架构设计应该尽量减少循环依赖的出现。在使用 forwardRef 之前,请考虑是否可以通过重构或重新设计来消除循环依赖。