MVVM + Reactive + WCF回调

3
我将使用MVVM+响应式扩展来处理一个具有回调的TCP.NET WCF服务。因此,我创建了一个ClientProxy类来接收回调。我在Model中订阅了该ClientProxy的Subject。现在,我想推送接收到的项到ViewModel中,而不必引用ViewModel。(注意:如果我拼错了某个实际项目名称,那并不是我的代码真正的样子。)

Model:

public Subject<CustomSale> CustomSaleAdded = new Subject<CustomSale>();

ClientProxy._onCustomSaleAdded.Subscribe(x =>
{
    CustomSaleAdded.OnNext(x);
});

然后在我的ViewModel中,我只是尝试要订阅ModelSubject CustomSaleAdded,并将其添加到我的ObservableCollection<Sale> Sales中:

_scheduleModel.CustomSaleAdded.Subscribe(x =>
{
    Sales.Add(x);
});

正在发生的是,项目从 ClientProxy 到达 Model,我看到它触发了 CustomSaleAdded.OnNext(x)。但是在 ViewModel 中,我设置了断点却没有任何反应。
那么,有人能告诉我在不使用 Reactive Extensions 的情况下,将一个 WCF 回调中的项目 推送ViewModel 中的 ObservableCollection 的最佳方法是什么?
此外,这是否是 Reactive UI 处理的内容?
我看到的大多数示例都显示 ViewModel 直接与 Web 服务一起工作。 而我有两个额外的层在 Model 中,然后是 ClientProxy,它们首先获取项目并将其 推送
1个回答

1
似乎不应该使用Subject<T>类来实现CustomSaleAdded成员,因为Subject<T>具有以下行为(Subject Class, Remarks section):
数据随后通过其IObservable接口发布给所有已订阅的观察者。
根本原因:当ViewModel在序列中推送一些元素后订阅时,ViewModel类可能会“错过”可观察序列的某些元素。
请考虑使用ISubject<T>接口的其他实现。
  • ReplaySubject类

    ReplaySubject缓存接收到的项。因此,稍后创建的订阅可以访问已经发布的缓冲序列中的项。ReplaySubject将缓冲多少项取决于传递给构造函数的参数。

  • BehaviorSubject类

    BehaviorSubject缓存通过其IObservable接口发布的最后一项。如果没有通过其IObservable接口发布任何项,则构造函数中提供的初始项是当前缓冲的项。当订阅BehaviorSubject的IObservable接口时,发布的序列从当前缓冲的项开始

    一旦BehaviorSubject的IObserver接口接收到完成信号,就不会缓存或发布任何项。

其他参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接