Angular 角度2-服务中的服务
我想在Angular2应用程序中使用两个Angular 角度2-服务中的服务,angular,typescript,Angular,Typescript,我想在Angular2应用程序中使用两个服务。当我尝试在GlobalsService中使用GuideService和GuideService中使用globalservice时,我收到以下错误: zone.js:392 未处理的承诺拒绝:(SystemJS)无法解析GuideService:(?,?)的所有参数。 错误:无法解析GuideService:(?,?)的所有参数。 在CompileMetadataResolver.\u getDependenciesMetadata 我的服务: exp
服务。当我尝试在GlobalsService
中使用GuideService
和GuideService
中使用globalservice
时,我收到以下错误:
zone.js:392
未处理的承诺拒绝:(SystemJS)无法解析GuideService:(?,?)的所有参数。
错误:无法解析GuideService:(?,?)的所有参数。
在CompileMetadataResolver.\u getDependenciesMetadata
我的服务:
export class GlobalsService {
[...]
constructor(private guideService: GuideService) { }
[...]
}
export class GuideService {
[...]
constructor(private globals: GlobalsService) { }
[...]
}
是否有其他方式以这种方式使用服务
编辑
我有这个GlobalsModule
,它被导入我的AppModule
:
import {NgModule} from "@angular/core";
import {CommonModule} from "@angular/common";
import {GlobalsService} from './globals.service'
@NgModule({
providers: [GlobalsService],
imports: [CommonModule]
})
export class GlobalsModule {
}
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) { }
[...]
}
注意:在大多数情况下,电路依赖性意味着您的设计是错误的。每个服务都应该有明确的责任,这样的设计很难让人看到。在这种情况下,你应该考虑把代码放在一个服务中。 < P>个人,我不赞成这样的循环依赖,也许这应该由第三个服务来处理,这两个服务都注入了这两个服务。无论如何,我确实认为您可以使用@Inject
和forwardRef
,两者都存在于“@angular/core”
包中:
export class GlobalsService {
[...]
constructor(
@Inject(forwardRef(() => GuideService))
private guideService: GuideService
) {}
[...]
}
export class GuideService {
[...]
constructor(
@Inject(forwardRef(() => GlobalsService))
private globals: GlobalsService
) {}
[...]
}
是否在您的模块中声明了GlobalsService
?是否必须在我的GuideModule
或我的AppModule
中声明?如果我必须声明它,我可以用现在的方式访问它吗?或者我必须以不同的方式使用它吗?事实上,在声明之前,是否提供了它(即包含在您的提供者元数据中)?感谢您的帮助。我仍然收到一个错误,但我将使用第三个服务来处理此问题。我忘记了forwardRef
。这个答案比我的好。谢谢你的帮助。我仍然得到一个错误,但我将使用第三个服务来处理这个问题。