Angular 2 - 服务中的服务

时间:2016-12-13 09:05:05

标签: angular typescript

我想在Angular2应用程序中使用两个compile 'org.grails:grails-validation:3.1.14' 。当我尝试使用services中的GuideServiceGlobalsService中的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

2 个答案:

答案 0 :(得分:5)

我个人不赞成这种循环依赖,也许这应该由注入这两种服务的第三种服务来处理。无论如何,我确实认为你可以使用@InjectforwardRef一起使用,"@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取决于service2service2取决于service1

解决方法:

@Injectable()
export class GlobalsService {

     [...]

     constructor(private injector: Injector) { }

     [...]


    get guideService() {
        return this.injector.get(GuideService);
    }
}

@Injectable()
export class GuideService {

     [...]

     constructor(private globals: GlobalsService) { }

     [...]

}

注意:在大多数情况下,循环依赖意味着您的设计是错误的。每项服务都应该有明确的责任,这种设计使人们很难看到。在这种情况下,您应该考虑将代码放在一个服务中。