MVVM模式:ViewModel在模型服务器往返后更新

时间:2010-04-13 01:31:11

标签: wpf data-binding mvvm design-patterns dto

我在服务器端有无状态服务和贫血域对象。服务器和客户端之间的模型是POCO DTO。客户端应该成为MVVM。该模型可以是20个不同类的约100个实例的图。客户端编辑器包含各种标签页,所有标签页都与模型/视图模型实时连接。

我的问题是如何在服务器往返之后传播更改很好的方法。将更改从ViewModel传播到DTO非常容易。回过头来就可以抛弃旧的DTO并用新的DTO替换它,但它会导致很多重绘列表/ DataTemplates。

我可以收集服务器端的更改并将它们传输到客户端。但是更改的字段名称将是特定于域/ DTO的,而不是特定于ViewModel的。对我来说,映射看起来并不重要。如果我应该在往返之后采取必要的方式,它将破坏viewModel的SOC /模块化。

我正在考虑某种映射规则引擎,例如automappper或者发射映射器。但它解决了非常简单的用例。我没有看到它如何映射/传播/转换添加项目到列表或删除。如何识别集合中的实例,以便它可以将值合并到现有实例。它也应该传播验证/错误信息。

也许我应该在DTO上实现INotifyPropertyChanged并尝试在其上重放服务器端事件?然后将ViewModel绑定到它?将绑定解决问题与集合合并的好方法? PRISM的EventAgregator对此有用吗?是否有任何事件记录重播组件?

对于具有服务器端逻辑的架构,是否有更好的客户端模式?

2 个答案:

答案 0 :(得分:1)

通常,我在我的Model类中保留了对DTO的引用。对于多个模型,我确保每个模型都知道如何从DTO构建自己,以及如何使用可注入的“保护程序”或其他服务提供者对象来保存自身。当您在模型上调用Save()时,对DTO的引用进行操作非常简单,在将其传递回服务之前根据模型修改旧DTO。

希望在Save()操作之后对其他对象的任何“更新”都可以在其他DTO中进行通信,然后将其加载到ViewModel使用的相应Model类中。

这样做的缺点是你确实必须编写映射代码,但这通常是最简单的部分。我不相信这是做事的最佳方式,我很乐意阅读别人的回答。

答案 1 :(得分:0)

我使用了另一种变化,取得了很大的成功。我们有一个实时GUI,因此客户端上的重复重绘是不可接受的。

我们让DTO知道他们的属性更改,并向ViewModel发出PropertyChanged个事件,因此重放服务器端事件。

代码很容易编写,单元测试等。当键入PropertyChangeListeners(ViewModels实现的接口)时,可以轻松浏览。

此边界也可用于将线程切换到GUI工作线程。