【问题标题】:How to keep Model consistent when saving via service?通过服务保存时如何保持模型一致?
【发布时间】:2010-12-28 02:12:12
【问题描述】:

我正在使用 MVVM 模式开发客户端/服务器 (WPF/WCF) 应用程序。

ViewModel 上的属性绑定到 Model 上的属性,这样当 Model 发生更改时,更改会立即传播到 View。

当用户点击刷新时,服务器上任何新增/更改的数据都会合并到Model中,因此刷新机制运行良好。

如何处理用户编辑和保存属性?这是我想要发生的事情:

  1. 用户点击“编辑”
  2. 用户修改文本框中的值
  3. 用户点击“保存”
  4. 更改已发送到服务器
  5. 如果成功,服务器返回更新的项目,合并到 模型,并且 UI 已更新。
  6. 如果不成功,服务器返回错误并且模型不更新。

似乎使用MVVM,Model在第3步更新(使第5&6步变得多余),如果服务端出现错误,客户端的数据与服务端不一致。

有处理这种情况的最佳实践方法吗?

【问题讨论】:

  • 在您的场景中,服务器上的数据是否可能与特定客户端不同步,而客户端无需执行任何操作?将来有可能吗?我问的原因是您可能需要一种不需要用户重新启动应用程序/手动刷新的同步策略。像这样的问题可能完全符合该策略。您可以在每次保存后简单地进行同步,无论好坏。
  • 是的 - 它是一个多用户应用程序,但每当用户查看项目时都会发生刷新,以便客户端是最新的。您的建议是有道理的,但是如果当用户单击“保存”时服务器已关闭,会发生什么情况?我希望恢复原始值(可能转换到离线模式)。
  • 部分问题在于您的网络服务 是 模型。远程副本和本地副本都是同一事物的表示。如果您无法远程更新模型,那么您应该在本地更新模型,并做任何您需要做的事情来应对它们不同步的情况。 “每当用户查看项目时都会发生刷新”。如果他们在查看时更新了怎么办?您应该弄清楚如何处理这种情况,以免一个用户意外撤消另一个用户的更改,因为他们碰巧打开了对话框。
  • 新的/更改的数据被合并到模型中,传播到视图。
  • @Greg:没问题。如果它没有帮助,它就没有帮助,因此为什么它不是一个答案:)

标签: wpf wcf oop mvvm synchronization


【解决方案1】:

我们处理此问题的方式存储了原始数据的副本。 每当更新失败时,我们都会将原始数据恢复到视图中。

【讨论】:

  • 如果程序员在他们的错误处理中总是考虑到它,这将起作用。我正在寻找一种架构解决方案,可以减轻单个程序员的负担。
【解决方案2】:

我想出的解决方案是创建第二组对象 - ModelUpdates。

当用户点击Edit时,一个ModelUpdate对象(与Model对象具有相同的属性)被实例化并且DataContext被切换到那个对象。

当用户单击保存时,ModelUpdate 对象的详细信息将发送到服务。该服务以有关更新对象的详细信息进行响应,然后将其合并到模型存储库中。

这意味着模型只会使用已成功保存的数据进行更新。如果对象保存不正确,数据库版本将被发送回客户端。如果保存时发生错误,数据库版本将被发送回客户端。如果服务器不可用,客户端将保留预编辑版本。

【讨论】:

    【解决方案3】:

    我认为应该使用同步发布方法。
    这样,如果发生错误,模型和视图端是相同的。此外,在取回保存的数据之前,您的视图不会更新。

    简单来说:

    1) 用户点击编辑
    2) 用户进行更改
    3) 用户点击保存
    3.1) 应用程序将数据汇总到模型
    3.2) 模型保存更改
    3.3) 模型返回更改的数据
    4) 查看带有成功(更改的数据)或失败消息的更改。

    【讨论】:

    • 感谢@Erik,但您的解决方案仍然存在我试图避免的问题 - 如果保存失败,则模型包含错误数据。
    猜你喜欢
    • 2015-09-03
    • 2018-03-03
    • 1970-01-01
    • 2021-09-10
    • 2016-08-27
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多