我正在尝试用Rx设计一个服务层抽象。我已经使用FromAsyncPattern
封装了所有的web服务调用。我将有多个ViewModels
订阅这些可观测值,有些可以有多个订阅。
-
我应该在我的
ServiceProxy
类(单例)中创建readonly
IObservable<T>
属性并在构造函数中构造一次,还是我应该每次在服务方法中创建新的可观察对象并返回它们? -
重要吗?
it matter ?
在本例中,no。这就是冷可观察对象(就像Create返回的)和热可观察对象之间的区别。FromAsyncPattern返回一个AsyncSubject,这意味着它将把结果"重播"给任何订阅者(所以,它是冷的,但不是完全相同的方式,更像是"冷")。
另一方面,Create最终将为每个订阅者重新运行代码(就像如果您有一个L2S查询一样,在它上运行Foreach将发出另一个数据库调用)。有时候这是你想要的,有时候不是。
要让一个Cold可观察对象变成Hot可观察对象,请在末尾加上这句话:
.Multicast(new Subject<TTheType>()).RefCount();
如果你想要一个热的可观察对象(比如observable . start),然后把它设为冷的,使用Defer:
var coldObs = Observable.Defer(() =>
Observable.Start(() => doSomethingAndReturnAValue()));
这意味着,每次有人订阅coldObs, dosomethingandreturnavvalue被调用。
你不能创建IObservalble<T>
属性来表示使用FromAsyncPattern
创建的IObservable,因为这个方法返回一个函数,当调用适当的值时将返回一个IObservable<T>
(其中T是原始底层同步方法的返回类型)。所以你的Rx抽象层将有一些方法,这些方法将实际参数作为原始服务层方法,但不是T
返回IObservable<T>
。