angular - 我们如何在 Angular 服务中使用forwardRef来避免循环依赖?

标签 angular angular-services forward-reference

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

我的场景是这样的:

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

如果有人遇到过任何此类类似问题并就如何解决此问题提供建议,那就太好了。

我知道循环依赖是可以避免的,但如果我们需要以正确的方式做到这一点,那么我应该采用什么方法?

谢谢

最佳答案

I have gone through couple of articles about resolving circular dependency in angular, all are mentioning about using forwardRef to resolve circular dependency.

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

forwordRef 允许您在提供可注入(inject) token 之前引用该 token 。

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

If two service depends on each other and which is causing the class circular dependency issue

导入是循环的。它与无关,但是当您尝试让文件A导入文件B,并且B也导入A时,您就会遇到循环问题。

I know circular dependency is avoidable but if we need to do it in a proper way, then what approach should I go with?

这听起来像是服务 A 依赖于服务 B,而服务 B 又依赖于服务 A。

如果循环导入是尝试使用 Angular 注入(inject)器的结果,那么您可以通过使用接口(interface)来解决该问题。您的至少一项服务应该有一个接口(interface),然后您为该服务定义一个注入(inject) token 。

import { InjectionToken } from '@angular/core';
export interface IServiceB {}

export const SERVER_B: InjectionToken<IServiceB> = new InjectionToken<IServiceB>('SERVICE_B');

然后,您可以在 ServiceB 类中实现 IServiceB,但不要在同一个类中定义 IServiceB 接口(interface),这一点非常重要文件作为ServiceB,否则一切都不是。

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

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

现在您可以安全地将此服务注入(inject)到 ServiceA

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

现在没有循环导入。

要转向另一个方向,您可能必须为 ServiceA 定义另一个接口(interface)。

关于angular - 我们如何在 Angular 服务中使用forwardRef来避免循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59072136/

相关文章:

angular - 如何在 Angular 2 应用程序中正确调用 window.matchMedia()

javascript - Angular JS - 变量返回未定义

angular - providedIn any 和 root 有什么区别

c++ - 为什么没有在函数模板的前向引用上选择重载?

Java - 枚举 - 逻辑循环引用

javascript - CSV 格式的 Angular 数据中的逗号相关问题

javascript - Angular 组件没有看到数组 @Input() 中的变化

IIS 上的 Angular url 问题

javascript - 如何在服务中定义 CRUD 操作 (AngularJS)

javascript - React.forwardRef 导致样式组件错误