我已经阅读了几篇关于解决 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/