我已经阅读了几篇关于在 Angular 中解决循环依赖的文章,都提到了使用 forwardRef 来解决循环依赖。
他们不应该告诉你,因为那不是它的目的。
forwordRef允许您在提供可注入令牌之前引用它。
循环依赖不是 Angular 问题。这是一个 TypeScript 编译问题。
如果两个服务相互依赖并且导致类循环依赖问题
进口是循环的。它与classes无关,但是当您尝试让文件 A 导入文件 B,并且 B 也导入 A 时,您就会遇到循环问题。
我知道循环依赖是可以避免的,但是如果我们需要以适当的方式做到这一点,那么我应该采用什么方法呢?
这听起来像是服务 A 依赖于服务 B,而服务 B 依赖于服务 A。
如果循环导入是尝试使用 Angular 注入器的结果,那么您可以改用接口来解决问题。至少您的一项服务应该有一个接口,然后您为该服务定义一个注入令牌。
import { InjectionToken } from '@angular/core';
export interface IServiceB {}
export const SERVER_B: InjectionToken<IServiceB> = new InjectionToken<IServiceB>('SERVICE_B');
然后您可以IServiceB
在ServiceB
类中实现,但不要在同一个文件中定义IServiceB
接口非常重要,否则一切都不是。ServiceB
然后,您可以在模块中提供此令牌。
@NgModule({
...
providers: [
{ provide: SERVICE_B: useClass: ServiceB }
]
)
现在您可以安全地将此服务注入ServiceA
@Injectable()
export class ServiceA {
constructor(@Inject(SERVICE_B) serviceB: IServiceB) {...}
}
现在没有循环进口。
要走另一个方向,您可能必须为ServiceA
.