无功扩展 - 返回相同的可观察或创建新的?

时间:2011-10-14 15:31:49

标签: c# wpf mvvm system.reactive

我正在尝试使用Rx设计服务层抽象。我已使用FromAsyncPattern完成了所有网络服务调用。我将有多个ViewModels订阅这些可观察对象,有些可以有多个订阅。

  • Shoud我在我的readonly类(singleton)中创建IObservable<T> ServiceProxy属性并在构造函数中构造一次,或者我应该每次在服务方法中创建新的observable并返回他们?

  • 重要吗?

2 个答案:

答案 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>