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

Pav*_*ara 7 data-binding wpf design-patterns mvvm dto

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

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

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

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

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

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

Pat*_*ski 1

通常,我会在模型类中保留对 DTO 的引用。对于多个模型,我确保每个模型都知道如何从 DTO 构建自身,以及如何使用可注入的“保护程序”或其他服务提供者对象来保存自身。当您在模型上调用 Save() 时,携带对 DTO 的引用可以非常轻松地根据模型修改旧的 DTO,然后再将其传回服务。

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

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