2016-12-13 5 views
3

У меня есть два services Я хочу использовать в своем приложении Angular2. Когда я пытаюсь использовать GuideService в GlobalsService и GlobalsService в GuideService я получаю эту ошибку:Угловой 2 - Сервис в обслуживании

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) { } 

    [...] 

} 

Есть ли другой способ использовать услуги таким образом?

EDIT У меня есть этот 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 { 
} 
+1

ли '' GlobalsService объявлены в модуле? – Meir

+0

Должен ли я объявить его в моем «GuideModule» или в моем «AppModule»? Если я должен объявить это, могу ли я получить к нему доступ так же, как сейчас, или мне нужно использовать его по-другому? – Oudstand

+0

На самом деле, перед объявлением, предоставляется ли оно (т. Е. Включено в метаданные вашего провайдера)? – Meir

ответ

1

Угловая не будет иметь возможность построить любой из ваших услуг. Службы не могут зависеть друг от друга при инъекции зависимостей конструктора.

За кулисами 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) { } 

    [...] 

} 

Примечание: Circural зависимость в большинстве случаев означает, что ваш дизайн является неправильным. У каждой службы должна быть четкая ответственность, и такой дизайн трудно понять. В таких ситуациях вы должны рассмотреть возможность ввода кода в одну службу.

+0

Благодарим за помощь. Я все еще получаю сообщение об ошибке, но для этого я буду использовать третью службу. – Oudstand

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 
    ) {} 

    [...] 

} 
+0

Благодарим вас за помощь. Я все еще получаю сообщение об ошибке, но для этого я буду использовать третью службу. – Oudstand

+2

Я забыл про 'forwardRef'. Этот ответ лучше моего. – rzelek