我有一个连接到远程后端的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”的读取模型,我如何确保命令可以在最终一致的过程中成功应用?
答案 0 :(得分:0)
我对您的问题的理解是,您需要很好地理解并应用optimistic concurrency,这在使用最终一致性时确实是推荐的。
对于CarstenKönig来说是正确的,您需要按照您希望对象更改的方式跟踪,以便在您想要将其保存在后端时更改其他人。这可以使用版本号来完成,MSDN建议使用TimeStamp。
无论如何,重点是您需要检查在保存对象时只有一个用户更改了对象,或者至少应用于对象的更改与其他更改没有冲突。否则,您需要引发错误并通知用户无法保存更改(或提供某种合并过程)。
用户可以在GUI上编辑许多不同的元素,但决定 仅在申请结束时保存或放弃
这种方法的问题在于它并不真正符合乐观并发,因为修改对象所需的时间越长,就越有可能与另一个用户更改产生冲突。 “管理撤消/重做”功能并不是IMHO不会尽快通知服务器更改的原因,除非您对与服务器的通信有一些限制。
根据您的具体情况,我会看到三种解决方案:
如果域可以接受,只要用户不关闭您的应用程序(显然它是一个真正不可扩展的解决方案),您就可以使用悲观并发(即锁定UI中的数据管理),并保留当前的撤消/重做管理。
否则,如果您需要可扩展,请使用乐观并发,因此最好不要在最后发送所有数据,而是在每次更改模型后(并在服务器端管理撤消/重做过程)< / p>
或者,如果经常发生同一对象的多重修改,请保留当前实现,添加乐观并发并为用户提供一些合并解决方案
希望它有所帮助。