循环依赖问题是一个公认的带有许多较小坑的问题。好消息是,恰当地使用依赖注入可以避免这些问题。下面是解决循环依赖问题的几种方法。
使用Angular的forwardRef方法,在组件初始化时注入引用还未准备好的依赖项。例如,在构建Provider时,可以使用forwardRef作为Provider的key,从而使其能够在提供者之前被提供。
import { Component, forwardRef, Inject } from '@angular/core';
import { SomeService } from 'some.service';
@Component({
selector: 'example-compo',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css'],
providers: [{
provide: 'some',
useExisting: forwardRef(() => SomeProvider)
}]
})
export class ExampleComponent {
constructor(@Inject('some') private someService: SomeService) {}
}
使用手动依赖注入来控制依赖顺序,这种方式的缺点是需要手动注入所有依赖项。
import { Component, Inject } from '@angular/core';
import { DependService } from './depend.service';
import { ModuleService } from './module.service';
@Component({
selector: 'example-component',
template: `Component works!
`
})
export class ExampleComponent {
depend: DependService;
constructor(private moduleService: ModuleService) {
this.depend = moduleService.doSomethingForMe();
}
}
消除循环依赖的最佳方法是重新架构组件或服务的依赖关系。例如,把循环依赖的组件拆分成多个子组件,每