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

leo*_*eox 3 forward-reference angular-services angular

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

我的场景是这样的:

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

如果有人遇到任何此类类似的问题并就如何处理此问题提出建议,那将是可观的。

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

谢谢

Rea*_*lar 6

我已经阅读了几篇关于在 angular 中解决循环依赖的文章,所有文章都提到了使用 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');
Run Code Online (Sandbox Code Playgroud)

然后您可以IServiceBServiceB类中实现,但不要IServiceB同一个文件中定义接口非常重要,ServiceB否则一切都不是。

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

@NgModule({
   ...
   provides: [
       { provide: SERVICE_B: useClass: ServiceB }
   ]
)
Run Code Online (Sandbox Code Playgroud)

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

@Injectable()
export class ServiceA {
    constructor(@Inject(SERVICE_B) serviceB: IServiceB) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在没有循环进口。

要走另一个方向,您可能必须为ServiceA.

  • 很好的解释 - 作为一个简短的说明,在这种情况下,上面的行应该是“一切都是为了虚无”,这意味着什么都没有,而不是“不”。 (2认同)