7

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

我的问题是如何在服务器往返后传播更改的好方法。将更改从 ViewModel 传播到 DTO 非常容易。回到过去,可以扔掉旧的 DTO 并用新的 DTO 替换它,但这会导致列表/数据模板的大量重绘。

我可以收集服务器端的更改并将它们传输到客户端。但是更改的字段名称将特定于域/DTO,而不是特定于 ViewModel。映射对我来说似乎很重要。如果我应该在往返后以命令的方式执行此操作,它将破坏视图模型的 SOC/模块化。

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

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

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

4

2 回答 2

1

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

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

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

于 2010-08-31T11:18:35.863 回答
0

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

我们让我们的 DTO 了解他们的属性更改,并向PropertyChangedViewModel 发出事件,从而重播服务器端事件。

PropertyChangeListeners代码很容易编写、单元测试等。在键入(由 ViewModel 实现的接口)时,浏览变得很容易。

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

于 2010-08-31T14:35:38.917 回答