两个服务如何以双向方式相互通信?

时间:2016-01-22 18:01:02

标签: angular angular2-services

以某种方式通过事件,在其他方面通过调用方法。我试图在我的应用程序中实现聚合模式。

我有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 个答案:

答案 0 :(得分:4)

如果将ServiceA注入ServiceB,ServiceB可以调用ServiceA上的方法(因此ServiceB→ServiceA通信),它可以subscribe()到ServiceA可能公开的任何Obervable(因此ServiceA→到ServiceB通信)。

缺少的是ServiceA能够直接调用ServiceB上的方法。通常不建议这样做,因为它会在服务之间创建耦合。 ServiceA应该在ServiceB可以next()到Observable上使用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