我们如何在角度服务中使用forwardRef来避免循环依赖?

时间:2019-11-27 14:14:49

标签: angular angular-services forward-reference

我已经阅读了几篇有关解决角度循环依赖的文章,所有文章都提到使用forwardRef解决循环依赖。我在网上找到的所有参考文献仅涉及组件服务交互。

我的情况是这样的:

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

如果有人遇到过类似的问题,并且对如何解决该问题提出了建议,则是很有意义的。

我知道循环依赖是可以避免的,但是如果我们需要以正确的方式进行操作,那我应该采用哪种方法呢?

谢谢

1 个答案:

答案 0 :(得分:1)

  

我已经阅读了几篇有关解决角度循环依赖的文章,所有文章都提到使用forwardRef解决循环依赖。

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

forwordRef 使您可以在提供之前引用可注射令牌。

循环依赖关系不是Angular问题。这是TypeScript编译问题。

  

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

进口是圆形的。它与 classes 没有关系,但是当您尝试将文件A导入文件B,并且B也导入文件A时,便遇到了循环问题。

  

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

这听起来像服务A取决于服务B,服务B取决于服务A。

如果圆形导入是尝试使用Angular注射器的结果,则可以通过使用接口来解决此问题。您的至少一项服务应具有一个接口,然后为该服务定义一个注入令牌。

export interface IServiceB { }

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

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

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

ServiceB

现在您可以安全地将此服务注入@NgModule({ ... provides: [ { provide: SERVICE_B: useClass: ServiceB } ] )

ServiceA

现在没有圆形进口。

要朝另一个方向发展,您可能必须为@Injectable() export class ServiceA { constructor(@Inject(SERVICE_B) serviceB: IServiceB) {...} } 定义另一个接口。