2016-12-13 9 views
3

私は2つを持っていますservices私は私のAngular2アプリケーションで使いたいです。角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

マイサービス::私はGuideServiceGlobalsServiceGuideServiceGlobalsServiceを使用しようとすると、私はこのエラーを取得する

export class GlobalsService { 

    [...] 

    constructor(private guideService: GuideService) { } 

    [...] 

} 

export class GuideService { 

    [...] 

    constructor(private globals: GlobalsService) { } 

    [...] 

} 

は、この方法でサービスを利用する他の方法はありますか?

EDIT は、私は私のAppModuleにインポートされ、このGlobalsModuleを持っている:

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は、サービスのリストを作成し、他のサービスを構築するために必要なサービス(依存関係のないサービスが最初になる)に基づいてリストをソートします。この場合、service1service2に依存し、service2service1に依存します。

回避策:

@Injectable() 
export class GlobalsService { 

    [...] 

    constructor(private injector: Injector) { } 

    [...] 


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

@Injectable() 
export class GuideService { 

    [...] 

    constructor(private globals: GlobalsService) { } 

    [...] 

} 

注:Circural依存ほとんどのケースでは、あなたのデザインが間違っていることを意味しています。それぞれのサービスには明確な責任があり、そのようなデザインは見えにくくなります。そのような状況では、コードを1つのサービスに入れることを検討する必要があります。

+0

ありがとうございます。私はまだエラーが発生しますが、私はこれを処理するために3番目のサービスを使用します。 – Oudstand

5

個人的に私はこのような循環依存性を否定し、おそらくこれは両方のサービスを注入する第3のサービスによって処理されるべきです。とにかく、私は"@angular/core"パッケージに存在し、両方、forwardRef@Injectを使用して可能であるあなたがやろうとしているものだと思います:

export class GlobalsService { 

    [...] 

    constructor(
     @Inject(forwardRef(() => GuideService)) 
     private guideService: GuideService 
    ) {} 

    [...] 

} 

export class GuideService { 

    [...] 

    constructor(
     @Inject(forwardRef(() => GlobalsService)) 
     private globals: GlobalsService 
    ) {} 

    [...] 

} 
+0

ありがとうございます。私はまだエラーが発生しますが、私はこれを処理するために3番目のサービスを使用します。 – Oudstand

+2

私は 'forwardRef'について忘れました。この答えは私より優れています。 – rzelek

関連する問題