2016-03-26 14 views
3

これは私の主要コンポーネント(ルートコンポーネント)です。ここでは、アプリケーション全体を通してアクセス可能と思われるいくつかのサービスを宣言します。Angular2 - 両方のサービスが互いに必要な場合

@Component({ 
    ... 
    providers: [ 
     WebSocketService, 
     ... 
     AuthenticationService, 
    ] 
}) 
export class MainComponent { ... } 

そして - 私がやっている - evrybodyが理解していることを確認する:

bootstrap(MainComponent, [...]); 

をWebSocketServiceとAuthenticationServiceの両方が@Injectable()でアノテートされています。両方のサービスが互いに必要とすることがわかるまで、すべてうまく機能しました。

例外: のすべてのパラメータを解決できません その結果、私はそのエラーメッセージを受信して​​るなど

をAuthenticationServiceは、バックエンドサーバとの通信にWebSocketServiceを必要とWebSocketServiceは、ユーザーがログインしているかどうかを確認するためにAuthenticationServiceを必要とします'AuthenticationService'(未定義)です。 のすべてのパラメータがInjectで装飾されているか、有効なタイプの注釈を持っていて、 'AuthenticationService'が注入可能で装飾されていることを確認してください。

ここには、AuthenticationServiceの断片があります。 WebSocketServiceは似ています。

@Injectable() 
export class AuthenticationService implements OnInit { 

    constructor(private webSocketService:WebSocketService) { 
    } 
    ... 
} 

私はこのような場合のために異なる、多分よりよい解決策(第3サービス、など)があるが、これは私の質問のポイントではないことを、知っています。 私が提示したのと同じようにAngular2を使って2つのサービスを互いに注入する方法があるかどうかを知りたいですか?

+0

forwardRefを使用するのではなく、循環参照を修正する方がよいでしょう。 –

答えて

3

更新 (テストしていません)

bootstrap(AppComponent, [ 
    provide(WebSocketService, {useFactory:() => { 
    let as = new AuthenticationService(); 
    let ws = new WebSocketService(as); 
    as.webSocketService = ws; 
    return ws; 
    }}), 
    provide(AuthenticationService, {useFactory: {(ws) => { 
    return ws.authenticationService; 
    }, deps: [WebSocketService]); 
    }) 
]); 

オリジナル (唯一のタイプの依存関係のため、いないインスタンスの依存関係のために働く)forwardRefを使用して解決すべき

循環参照が必要(する必要があります輸入元angular2/core

constructor(@Inject(forwardRef(() => WebSocketService)) private webSocketService:WebSocketService) { 
+0

これは両方のサービスで実行する必要がありますか? –

+0

実際に私は知らない。あなたがエラーメッセージを受け取った場所でそれを行うと、同じエラーメッセージが表示された場合は、その場所にも同様に行います。 http://blog.thoughtram.io/angular/2015/09/03/forward-references-in-angular-2.html –

+0

これはちょっと助けましたが、今は「例外:循環依存をインスタンス化できません。 ! (MainComponent - > AuthenticationService - > WebSocketService - > AuthenticationService) 'を呼び出します。しかし、今私はどこに問題があるか知っています。以前のエラーは私には奇妙でした:) –

関連する問題