MVVM模式:在Model服务器往返后,ViewModel进行更新

7
我有一些无状态服务和贫血领域对象在服务器端。服务器和客户端之间的模型是POCO DTO。客户端应该成为MVVM。该模型可能是大约20个不同类别的100个实例的图形。客户端编辑器包含各种选项卡页,它们全部与模型/视图模型实时连接。
我的问题是如何以良好的方式传播服务器往返后的更改。从ViewModel到DTO传播更改相当容易。对于回程,可以丢弃旧的DTO并用新的DTO整体替换它,但这将导致列表/DataTemplates的大量重绘。
我可以收集服务器端的更改并将其传输到客户端。但是更改名称将是特定于领域/DTO,而不是ViewModel特定的。映射对我来说似乎不太平凡。如果我应该在往返之后以命令方式执行它,则会破坏viewModels的SOC/可扩展性。
我正在考虑某种映射规则引擎,类似于automappper或emit mapper。但它只解决非常简单的用例。我不知道它如何映射/传播/转换添加项目到列表或删除。如何识别集合中的实例,以便将值合并到现有实例中。同时,它还应该传播验证/错误信息。
也许我应该在DTO上实现INotifyPropertyChanged,并尝试在其中重放服务器端事件?然后将ViewModel绑定到它?绑定是否可以很好地解决集合合并的问题?PRISM的EventAgregator对此有用吗?是否有任何事件记录回放组件?
是否有更好的客户端模式可用于具有服务器端逻辑的架构?
2个回答

1
通常我会在我的模型类中保持对DTO的引用。 对于多个模型,我确保每个模型都知道如何从DTO构建自身,以及如何使用可注入的“saver”或其他服务提供者对象保存自己。 携带DTO的引用使得在调用模型的Save()时相当容易根据模型修改旧的DTO,然后将其传回服务。 希望在Save()操作之后对其他对象进行“更新”的任何内容都可以在其他DTO中进行通信,然后将其加载到您的ViewModel使用的适当模型类中。
这样做的缺点是确实需要编写映射代码,但这通常是最容易的部分。 我不确定这是否是做事情的最佳方式,我很想阅读其他人的回复。

这是我在这种情况下的默认方法。通常,保存后的更新是通过服务器事件触发的,每个模型都可以从DTO更改触发的更改中更新自己。 - Steve Jackson

0

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

我们让DTO知道它们的属性变化,并发出PropertyChanged事件到ViewModel,从而重新播放服务器端事件。

编写代码、单元测试等工作都变得简单明了。当实现的接口被键入时,浏览也变得容易了。

这个边界还可以用于将线程切换到GUI工作线程。


1
我会对这样做感到担忧。使用DTO的价值在于它们只关注一个问题——在服务边界之间传输数据,并且可以针对此目的进行优化。没有方法、没有参数化构造函数、没有事件——这些都是领域对象/模型的问题。我曾经有一个WCF项目,我们将领域对象用作DTO。这很有效,直到我们需要构造函数逻辑来初始化(由于WCF使用属性初始化而未运行)。这种事情不断扩大,越来越多的愚蠢的领域问题干扰了我们的DTO,反之亦然。糟糕。 - Patrick Szalapski
你让我认识到我的特殊项目很幸运...我们确实偶尔会有DTO和领域之间的冲突需求,但我们能够在DTO类中将它们保持正交。 - louisgab

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