【问题标题】:How can we use forwardRef in a angular service to avoid Circular dependency?我们如何在角度服务中使用 forwardRef 来避免循环依赖?
【发布时间】:2020-03-23 02:58:21
【问题描述】:

我已经阅读了几篇关于在 Angular 中解决循环依赖的文章,都提到了使用 forwardRef 来解决循环依赖。我在网上找到的所有参考资料都只涉及组件服务交互。

我的场景是这样的:

如果两个服务相互依赖并导致类循环依赖问题。我找不到与使用 forwardRef 或解决两个服务之间的循环依赖关系的任何最佳方法相关的适当线程。

如果有人遇到过任何类似的问题,并且对如何解决这个问题有建议,那是很重要的。

我知道循环依赖是可以避免的,但是如果我们需要以适当的方式来做,那么我应该采用什么方法呢?

谢谢

【问题讨论】:

  • 如果两个服务相互依赖,你就有了代码异味。引入用作层的第三个服务。
  • 是的,假设,在这种情况下,我无法避免循环依赖,在这种情况下,我们如何解决问题,我知道使用组件服务,我们可以使用 forwardRef 或我手动提供来处理它依赖关系。

标签: angular angular-services forward-reference


【解决方案1】:

我已经浏览了几篇关于在 Angular 中解决循环依赖的文章,都提到了使用 forwardRef 来解决循环依赖。

他们不应该告诉你这些,因为那不是它的目的。

forwordRef 可让您在提供之前引用可注入令牌。

循环依赖不是 Angular 问题。这是一个 TypeScript 编译问题。

如果两个服务相互依赖并导致类循环依赖问题

导入是循环的。它与 无关,但是当您尝试让文件 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');

然后您可以在ServiceB 类中实现IServiceB,但重要的是不要在同一文件 中将IServiceB 接口定义为ServiceB,否则一切都不是。

然后您可以在模块中提供此令牌。

@NgModule({
   ...
   providers: [
       { provide: SERVICE_B: useClass: ServiceB }
   ]
)

现在您可以安全地将这个服务注入ServiceA

@Injectable()
export class ServiceA {
    constructor(@Inject(SERVICE_B) serviceB: IServiceB) {...}
}

现在没有循环导入。

要走另一个方向,您可能必须为ServiceA 定义另一个接口。

【讨论】:

  • 很好的解释 - 作为一个快速说明,在这种情况下,上面的行应该是“一切都是徒劳的”,这意味着什么都没有,而不是“不”。
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 2013-02-06
  • 1970-01-01
  • 2018-09-03
  • 2012-02-15
  • 2016-08-09
  • 2013-04-02
相关资源
最近更新 更多