【问题标题】:Wait and send batch of commands on save等待并在保存时发送一批命令
【发布时间】:2014-09-23 21:08:49
【问题描述】:

我有一个连接到远程后端的 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”的读取模型正在从另一个消费者更新,我如何确保可以在最终一致的过程中成功应用命令?

【问题讨论】:

  • 我认为这取决于 - IMO 最好的方法是使 eventscommands 比你所做的更小,并带来某种并发检查使用它们(通常只是一个版本号)-然后在更新之前,您可以再次重新查询当前状态,如果所有其他方法都失败,后端会给您一个并发检查-我认为如果没有某种锁,您真的不能避免这种情况
  • 为了更清楚一点:后端必须检查一致性! (前端也可以检查,但后端必须说了算)

标签: c# cqrs


【解决方案1】:

我对你的问题的理解是你需要很好的理解和应用optimistic concurrency,在你使用最终一致性的时候真的很推荐。

Carsten König 是对的,您需要按照您希望对象更改的方式进行跟踪,以便在您想将其保存在后端时了解其他人是否更改了它。这可以通过版本号来完成,MSDN 建议使用时间戳。

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

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

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

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

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

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

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

希望对你有帮助。

【讨论】:

  • 我明白,但对于命令处理方面:我必须从保存的事件中重新创建我的对象,这些事件可能会丢失正在处理的最新事件,或者我错过了一些已知信息?
  • 对不起,我不明白你的意思?您的对象是在查询期间创建的(可能是在您创建 UI 时)。因此,当您发送命令更新这些对象时,您需要检查它们是否未在其他地方修改。
猜你喜欢
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2021-08-26
  • 2017-03-07
相关资源
最近更新 更多