我正在尝试使用Rx设计服务层抽象。我已使用FromAsyncPattern
完成了所有网络服务调用。我将有多个ViewModels
订阅这些可观察对象,有些可以有多个订阅。
Shoud我在我的readonly
类(singleton)中创建IObservable<T>
ServiceProxy
属性并在构造函数中构造一次,或者我应该每次在服务方法中创建新的observable并返回他们?
重要吗?
答案 0 :(得分:4)
重要吗?
在这种情况下,没有。这是 cold observable(比如Create返回)和 hot observable之间的区别。 FromAsyncPattern返回一个AsyncSubject,这意味着它会将结果“重播”给任何订阅者(因此,它很冷,但不是完全相同,更像'chilly')。
另一方面,创建重新运行每个订阅者的代码(就像你有一个L2S查询一样,在它上面运行Foreach会发出另一个数据库调用)。有时候这就是你想要的,有时却不是。
要将Cold observable变为Hot observable,请将其添加到结尾:
.Multicast(new Subject<TTheType>()).RefCount();
如果您想采用热观察(如Observable.Start)并使其冷,请使用Defer:
var coldObs = Observable.Defer(() =>
Observable.Start(() => doSomethingAndReturnAValue()));
这意味着,每当有人订阅coldObs时,都会调用doSomethingAndReturnAValue。
答案 1 :(得分:0)
您无法创建IObservalble<T>
属性来表示使用FromAsyncPattern
创建的IObservable,因为此方法返回一个函数,该函数在使用适当的值调用时将返回IObservable<T>
(其中T是返回值)原始基础同步方法的类型)。因此,您的Rx抽象层将具有将实际参数作为原始服务层方法的方法,而不是T
返回IObservable<T>
。