以某种方式通过事件,在其他方面通过调用方法。我试图在我的应用程序中实现聚合模式。
我有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注入其中。
答案 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() { ... }
}