我想在Angular2应用程序中使用两个compile 'org.grails:grails-validation:3.1.14'
。当我尝试使用services
中的GuideService
和GlobalsService
中的GlobalsService
时出现此错误:
GuideService
我的服务:
zone.js:392
Unhandled Promise rejection: (SystemJS) Can't resolve all parameters for GuideService: (?, ?).
Error: Can't resolve all parameters for GuideService: (?, ?).
at CompileMetadataResolver._getDependenciesMetadata
是否有其他方式以这种方式使用服务?
修改
我在export class GlobalsService {
[...]
constructor(private guideService: GuideService) { }
[...]
}
export class GuideService {
[...]
constructor(private globals: GlobalsService) { }
[...]
}
:
GlobalsModule
AppModule
答案 0 :(得分:5)
我个人不赞成这种循环依赖,也许这应该由注入这两种服务的第三种服务来处理。无论如何,我确实认为你可以使用@Inject
与forwardRef
一起使用,"@angular/core"
包中都存在:
export class GlobalsService {
[...]
constructor(
@Inject(forwardRef(() => GuideService))
private guideService: GuideService
) {}
[...]
}
export class GuideService {
[...]
constructor(
@Inject(forwardRef(() => GlobalsService))
private globals: GlobalsService
) {}
[...]
}
答案 1 :(得分:1)
Angular将无法构建您的任何服务。服务在构造函数依赖注入中不能相互依赖。
在幕后,Angular创建服务列表,并根据构建其他服务所需的服务对列表进行排序(首先是没有依赖的服务)。在这种情况下,service1
取决于service2
而service2
取决于service1
。
解决方法:
@Injectable()
export class GlobalsService {
[...]
constructor(private injector: Injector) { }
[...]
get guideService() {
return this.injector.get(GuideService);
}
}
@Injectable()
export class GuideService {
[...]
constructor(private globals: GlobalsService) { }
[...]
}
注意:在大多数情况下,循环依赖意味着您的设计是错误的。每项服务都应该有明确的责任,这种设计使人们很难看到。在这种情况下,您应该考虑将代码放在一个服务中。