User interface NServicebus/CQRS:如何处理用户界面中的事情?

User interface NServicebus/CQRS:如何处理用户界面中的事情?,user-interface,nservicebus,cqrs,User Interface,Nservicebus,Cqrs,我一直在读Udi Dahan关于[Command Query separation and SOA][1]的文章。考虑到我将如何在一个我目前正在研究的系统中实际使用它,我提出了一些问题 一, 考虑以下情况,其中我有一个WPF客户端应用程序,允许用户编辑条目列表: 客户端应用程序已启动。在启动时,它订阅将处理和发布条目更改的命令服务,并查询WCF服务以获取完整的条目列表。收到条目列表后,在等待WCF回复时可能已发布到客户机队列的任何更改(由其他客户机进行)都将合并到列表中 现在对我来说,客户机在

我一直在读Udi Dahan关于[Command Query separation and SOA][1]的文章。考虑到我将如何在一个我目前正在研究的系统中实际使用它,我提出了一些问题


一,

考虑以下情况,其中我有一个WPF客户端应用程序,允许用户编辑条目列表:

客户端应用程序已启动。在启动时,它订阅将处理和发布条目更改的命令服务,并查询WCF服务以获取完整的条目列表。收到条目列表后,在等待WCF回复时可能已发布到客户机队列的任何更改(由其他客户机进行)都将合并到列表中

现在对我来说,客户机在处理负责更改的命令之后立即订阅,并且WCS服务的查询在将相同的更改提交到数据库之前启动的可能性似乎很小。在这种情况下,我的客户机中的数据将不正确,并且永远不会与数据库同步(除非客户机应用程序重新启动)。这个问题真的存在吗?如果存在,应该如何处理


二,。 我的第二个问题是关于如何设计/实现用户界面:

用户现在想要更改列表中的条目;弹出一个窗口,更改数据并按下ok按钮:我们向命令处理程序发送一条消息以处理此更改。 用户希望看到确认(列表中的条目更改)或错误 信息

现在,我可以尝试以“同步”方式处理用户界面中的事情(让用户一次做一件事,让他等待成功或失败,然后再允许他做其他事情),方法如下:

  • 用户按下“确定”后,禁用所有控件,以便无法进行进一步编辑
  • 创建一个等待…的超时传奇。。。?回应信息?从命令服务发布的通知?两者都有
  • 当收到响应消息时,列表中的数据被更改,控件被启用,我们就完成了——或者:
  • 发生超时。命令消息已排队,因此最终将执行更改,那么该怎么办?向用户显示消息(“这花费的时间比预期的要长…”),启用所有控件并在从命令服务收到通知后更改客户端中的数据?但是如果返回了错误怎么办?用户可能已经开始做其他事情(可能编辑另一个条目),并且从以前的编辑尝试中弹出错误消息似乎不是一个好主意
  • 另一种方法可能是发送命令,让用户继续下一步想做的事情。可能会在用户界面的某个位置的列表中显示所有未完成的命令,并带有成功或失败的指示器,以及用户在出现故障时显示错误消息的可能性。考虑到超时可能是例外情况,并且通常应在几秒钟内收到响应,这意味着此列表通常最多应有一条未完成的命令。。事实上,我不记得我曾经见过一个用户界面以这种方式工作,这意味着这可能不是一个好主意

    你的问题是?;)

    我只是想知道其他人是如何在他们的用户界面中解决这个问题的。可能有更好的方式来处理UI中的事情,而不是我想出的两种可能不那么聪明的方式

    对于长文本表示歉意,并提前感谢您的回复


    [1] :“命令查询分离和SOA”

    对于问题1,查询的标准解决方案是创建客户端RPC请求/响应所针对的服务器端持久查询存储

    对于第二个问题,答案在很大程度上取决于领域——命令的种类,用户间协作的性质。作为一项首要规则,请考虑如何更改UI和/或命令的数据/处理,以使命令几乎不会失败(除非我们讨论的是恶意用户)

    希望有帮助