反应式扩展 - 返回相同的可观察值还是创建新的?

发布于 2024-12-09 18:33:20 字数 303 浏览 0 评论 0原文

我正在尝试使用 Rx 设计服务层抽象。我已使用 FromAsyncPattern 封装了所有 Web 服务调用。我将有多个 ViewModel 订阅这些可观察量,有些可以有多个订阅。

  • 我应该在我的 ServiceProxy 类(单例)中创建 readonly IObservable 属性并在构造函数中构造一次,还是应该创建每次在服务方法中创建新的可观察量并返回它们?

  • 这重要吗?

I am trying to design a service layer abstraction with Rx. I have wrapped up all webservice calls using FromAsyncPattern. I will have multiple ViewModels subscribing to these observables, some can have multiple subscriptions.

  • Shoud I create readonly IObservable<T> properties in my ServiceProxy class (singleton) and construct once in the constructor or should I create new observables every time in service methods and return them ?

  • Does it matter ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撧情箌佬 2024-12-16 18:33:21

您无法创建 IObservalble 属性来表示使用 FromAsyncPattern 创建的 IObservable,因为此方法返回一个函数,当使用正确的值调用该函数时,该函数将返回一个 IObservable< T>(其中 T 是原始底层同步方法的返回类型)。因此,您的 Rx 抽象层将具有将实际参数作为原始服务层方法的方法,但返回的不是 T,而是 IObservable

You cannot create IObservalble<T> properties to represent IObservable created from using FromAsyncPattern, as this method returns a function which when called with proper values will return a IObservable<T> (where T is the return type of the original underlying synchronous method). So your Rx abstraction layer will have methods which take the actual parameters as original service layer methods but instead of T returns IObservable<T>.

怀里藏娇 2024-12-16 18:33:20

这重要吗?

在这种情况下,不。这是可观察值(如 Create 返回的值)和可观察值之间的区别。 FromAsyncPattern 返回一个 AsyncSubject,这意味着它将向任何订阅者“重播”结果(因此,它是冷的,但不是以完全相同的方式,更像是“冷”)。

另一方面,Create 最终会为每个订阅者重新运行代码(就像您有 L2S 查询一样,在其上运行 Foreach 会发出另一个数据库调用)。有时这是您想要的,有时却不是。

要将 Cold observable 变成 Hot observable,请将以下内容添加到末尾:

.Multicast(new Subject<TTheType>()).RefCount();

如果您想获取一个 hot observable(如 Observable.Start)并将其设为冷的,请使用 Defer:

var coldObs = Observable.Defer(() => 
    Observable.Start(() => doSomethingAndReturnAValue()));

这意味着,每当有人订阅 ColdObs 时,doSomethingAndReturnAValue 就会被调用。

Does it matter ?

In this case, no. This is the difference between a cold observable (like what Create returns) and a hot observable. FromAsyncPattern returns an AsyncSubject, which means that it will "Replay" the result to any subscribers (so, it's cold, but not in exactly the same way, more like 'chilly').

Create, on the other hand, will end up rerunning the code for every subscriber (just like if you had a L2S query, running Foreach on it would issue another database call). Sometimes this is what you want, sometimes it isn't.

To make a Cold observable into a Hot observable, add this to the end:

.Multicast(new Subject<TTheType>()).RefCount();

And if you want to take a hot observable (like Observable.Start) and make it cold, use Defer:

var coldObs = Observable.Defer(() => 
    Observable.Start(() => doSomethingAndReturnAValue()));

This means, that every time someone Subscribes to coldObs, doSomethingAndReturnAValue gets called.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文