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

C# 等待并在保存时发送批命令,c#,cqrs,C#,Cqrs,我有一个连接到远程后端的WPF应用程序:用户可以在GUI上编辑许多不同的元素,但只能在应用程序关闭时决定保存或放弃。 GUI支持撤消/重做 我已经跟踪每个编辑,并在保存时生成必要的命令以在后端执行编辑:我的命令类似于: public class ChangeDescriptionOfTypeAObject { public string OldValue{ get; set; } public string NewValue{ get; set; } public str

我有一个连接到远程后端的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建议使用时间戳

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

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

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

根据您的环境,我看到三种解决方案:

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

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

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


希望能有所帮助。

我认为这要看情况而定-我认为最好的办法是使事件和命令比您所做的要小,并对它们进行某种并发性检查(通常只是一个版本号)-然后在更新之前,您可以再次查询当前状态,如果所有其他操作都失败,后端将对您进行并发检查-我不认为您可以在没有某种锁定的情况下真正避免这种情况。更清楚一点:后端必须检查一致性!(前端也可以检查,但后端必须拥有最后发言权)我明白,但对于命令处理方面:我必须从保存的事件中重新创建对象,这些事件可能会丢失进程中的最新事件,或者我丢失了一些知识?很抱歉,我不明白你的意思?您的对象是在查询过程中创建的(当您创建UI时)。因此,当您发送更新这些对象的命令时,需要检查它们是否在其他地方被修改。