2016-03-26 1 views
3

Ceci est mon composant principal (le composant racine). Ici, je déclare certains services qui sont censés être accessibles à travers l'application entière.Angular2 - lorsque les deux services ont besoin l'un de l'autre

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

Et - pour être sûr que evrybody comprendre - je fais:

bootstrap(MainComponent, [...]); 

deux WebSocketService et AuthenticationService sont annotés avec @Injectable(). Tout a bien fonctionné jusqu'à ce que je trouve que les deux services ont besoin l'un de l'autre. a besoin AuthenticationService WebSocketService pour communiquer avec le serveur back-end et a besoin WebSocketService AuthenticationService pour vérifier si est connecté l'utilisateur, etc.

En conséquence, je reçois ce message d'erreur:

EXCEPTION: ne peut pas résoudre tous les paramètres pour 'AuthenticationService' (indéfini). Assurez-vous que tous les paramètres sont décorés avec Inject ou ont des annotations de type valides et que 'AuthenticationService' est décoré avec Injectable.

Voici le fragment de AuthenticationService. WebSocketService est similaire.

@Injectable() 
export class AuthenticationService implements OnInit { 

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

Je sais, qu'il existe différents et peut-être de meilleures solutions pour ce cas (troisième service, etc.), mais ce n'est pas le point de ma question. Je voudrais savoir s'il existe un moyen d'injecter deux services l'un dans l'autre avec Angular2 de la même manière que je l'avais présenté?

+0

Vous feriez mieux en corrigeant la référence circulaire au lieu d'utiliser forwardRef. –

Répondre

3

Mise à jour (non testé)

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]); 
    }) 
]); 

originale (ne fonctionne que pour les dépendances de type, non pas pour les dépendances d'instance)

circulaire besoin référencé à résoudre en utilisant forwardRef (doit être importé de angular2/core

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

Cela doit être fait dans les deux services? –

+0

En fait, je ne sais pas. Si vous le faites pour celui où vous obtenez le message d'erreur et que vous obtenez le même message d'erreur pour l'autre, faites-le également. Voir aussi http://blog.thoughtram.io/angular/2015/09/03/forward-references-in-angular-2.html –

+0

Cela a aidé un peu, mais maintenant je reçois 'EXCEPTION: Impossible d'instancier la dépendance cyclique ! (MainComponent -> AuthenticationService -> WebSocketService -> AuthenticationService) '. Mais maintenant je sais où est le problème. Erreur précédente était étrange à moi :) –