2016-01-22 69 views
1

以事件的一種方式,通過其他方式調用方法。我試圖在我的應用程序中實現聚合模式。兩種服務如何以雙向方式相互溝通?

我有AuthService,在這裏我處理auth結果併發出事件。

if (auth) { this.eAuth.emit(true) } else { this.eAuth.emit(false) } 

我可以在AuthComponent

_authService.eAuth.subscribe((isAuth) => this.handleAuthResult(isAuth)) 

訂閱和它的作品完美。但是AggregateService也需要知道這些信息並將這些信息廣播到UserService,LoadDataService等。

怎麼辦?

upd:我的AggregateService沒有組件,我已經注入了AuthService。

+1

EventEmitter確實服務和組件之間不僅工作,它們是組分之間實際上是有用的,一種組分可以反應以由其他組件發出的事件並調用一個不同的服務時,它發生。 – Langley

+0

我的AggregateService沒有組件。 – ivanesi

+0

您可以將服務注入到其他服務中並隨時調用它,而不必使用EventEmitter。 – Langley

回答

4

如果ServiceA被注入ServiceB,ServiceB可以調用(因此ServiceB → ServiceA通信)上ServiceA方法,它可以subscribe()任何Obervable該ServiceA可能暴露(因此ServiceA →到ServiceB通信)。

缺少的是ServiceA能夠直接調用ServiceB上的方法。這通常不被推薦,因爲它在服務之間建立了耦合。 ServiceA應該使用Observable上的next()發出事件,ServiceB可以爲subscribe(),ServiceB可以自己調用適當的方法。但是,如果您真的需要這樣做,可以使用以下方法:ServiceB在ServiceA上調用某種方法registerService(this)。參數的類型應該是一個接口而不是具體類型,以限制耦合。然後ServiceA將引用ServiceB並可以調用它的方法。

interface SomeInterface { 
    public methodOne(); 
    public methodTwo(); 
} 

import {SomeInterface} from './some-interface'; 
export class ServiceA { 
    registerService(someService:SomeInterface) { 
     someService.methodOne(this); 
     // you'll probably want to store someService in this object 
    } 
} 

ServiceB應該implement該接口 - 即,實施一套ServiceA可以調用的方法。

import {SomeInterface} from './some-interface'; 
export class ServiceB implements SomeInterface { 
    constructor(private _serviceA: ServiceA) { 
     _serviceA.registerService(this); 
    } 
    methodOne(who) { 
     console.log('hello from ServiceB.methodOne(), called by', who); 
    }   
    methodTwo() { ... } 
} 

Plunker

+0

您說過「如果將ServiceA注入到ServiceB中,它可以訂閱()到ServiceA可能公開的任何EventEmitter」。 ServiceA也被注入到ServiceC中。 ServiceA的ServiceB調用方法→ServiceA發出事件→我可以在ServiceB中訂閱並且它可以工作(但不需要)。我需要在ServiceC中訂閱它,但無法使其工作。 http://plnkr.co/edit/b4W09zOqoOLUgI3DRvDv – ivanesi

+0

@vanesi,你的闖入者有很多問題。我相信我修正了他們......看看[這個闖入者](http://plnkr.co/edit/TfsHY79aTxngWiKBWeZt?p=preview)。 –

+0

感謝您的幫助 – ivanesi