等待并在保存时发送一批命令

本文关键字:一批 命令 保存 等待 | 更新日期: 2023-09-27 18:23:59

我有一个连接到远程后端的WPF应用程序:用户可以编辑GUI上的许多不同元素,但只能在应用程序关闭时决定保存或放弃。GUI支持撤消/重做。

我已经跟踪了每一次编辑,并在保存时生成必要的命令来在后端执行编辑:我的命令类似于:

public class ChangeDescriptionOfTypeAObject
{
  public string OldValue{ get; set; }      
  public string NewValue{ get; set; }
  public string ObjectID{ get; set; }
}

这在当前的应用程序中有效,但我认为如果另一个用户同时更改相同的属性,命令会失败。可能我必须向用户发送一条消息,"对象ObjectID上的描述更改无法应用:当前值为xxx",并应用所有其他更改。

这是一个正确的方法吗?如果我用来检查"CurrentValue==OldValue"的读取模型是从另一个使用者更新的,我如何确保命令能够在最终一致的过程中成功应用?

等待并在保存时发送一批命令

我对您的问题的理解是,您需要很好地理解和应用乐观并发,当您使用最终一致性时,这是真正建议的。

因此,Carsten König是对的,当你想将对象保存在后端时,你需要通过你想要对象更改的方式来跟踪,以知道是否有其他人更改了它。这可以通过一个版本号来完成,MSDN建议使用TimeStamp。

不管怎样,关键是您需要检查在保存对象时是否只有一个用户更改了对象,或者至少应用于对象的更改与其他更改没有冲突。否则,您需要引发错误并通知用户无法保存更改(或提供某种合并过程)。

用户可以编辑GUI上的许多不同元素,但决定仅在应用程序关闭时保存或丢弃

这种方法的问题在于,它并不真正符合乐观并发,因为修改对象所需的时间越长,就越有可能与另一个用户更改产生冲突。"管理撤消/重做"功能不是IMHO不尽快通知服务器更改的原因,除非您对与服务器的通信有一些限制。

根据您的情况,我看到了三种解决方案:

  • 如果这对域来说是可以接受的,那么只要用户不关闭你的应用程序(显然这是一个真正不可扩展的解决方案),你就可以使用悲观并发(即锁定UI中的数据管理),并保持你当前的撤消/重做管理。

  • 否则,如果您需要可伸缩性,请使用乐观并发,因此不希望在最后发送所有数据,而是在每次更改模型后发送(并在服务器端管理撤消/重做过程)

  • 或者保持当前的实现,添加乐观并发,如果经常发生对同一对象的多次修改,则为用户提供一些合并解决方案

希望能有所帮助。