User interface CQRS任务UI-响应基础更改

User interface CQRS任务UI-响应基础更改,user-interface,cqrs,User Interface,Cqrs,作为我的CQRS实现的一部分,我已经进入了一些面向任务的UI 问题是,由于从同一UI发送的初始命令所做的更改,我遇到了更新UI中其他属性的需要 我的情况不同,但这里有一个例子。。。 例如,命令将项目添加到购物车导致以下事件(所有这些事件都需要反映在UI上) 更改为存储库存 将商品添加到购物车 将总额更改为销售税 在不将业务逻辑烘焙到UI中的情况下,处理此问题的最佳方法是什么 是否将作为结果执行的结果事件列表返回给初始命令 返回反映更改的DTO 其他想法 我还没有完成,但我的想法是使用Sig

作为我的CQRS实现的一部分,我已经进入了一些面向任务的UI

问题是,由于从同一UI发送的初始命令所做的更改,我遇到了更新UI中其他属性的需要

我的情况不同,但这里有一个例子。。。 例如,命令将项目添加到购物车导致以下事件(所有这些事件都需要反映在UI上)

  • 更改为存储库存
  • 将商品添加到购物车
  • 将总额更改为销售税
在不将业务逻辑烘焙到UI中的情况下,处理此问题的最佳方法是什么

  • 是否将作为结果执行的结果事件列表返回给初始命令
  • 返回反映更改的DTO
  • 其他想法

我还没有完成,但我的想法是使用SignalR框架中的一个中心,订阅事件并对其采取行动。只要您可以将用户guid与signar中连接的用户guid关联起来,就可以将更新发送到正确的客户端,甚至可以检测它们是否仍然存在

Signaler还没有那么成熟,但我做的测试效果相当不错


我在Knockoutjs中使用它,我只更新我的视图模型和调用函数

这些事件真的需要反映在UI中吗?考虑Amazon,他展示了“你只是增加了你的购物车”,但不显示任何其他细节。这可以通过重新定义它来避免问题

否则,您为什么害怕“UI”中的业务逻辑?具体来说,为什么不在您的客户机中包含拥有该系统每个部分的服务中的一些组件,并让他们负责执行任何适当的本地更新

换句话说,让销售税服务的部分逻辑在UI中运行是很好的。你(显然)不相信它会计算税收,但你完全可以相信它会为客户做正确的事情

该模型的另一个优点是,您可以为用户获得即时反馈,或者至少可以选择显示即时反馈,而无需将更多业务流程知识烘焙到客户机中

例如,重新计算配送需要时间——如果您的客户在这上面显示一个微调器,那么需要知道一些事情来触发该显示,对吗


如果您的UI知道这一点,它会在流程周围嵌入业务流程。另一方面,如果您的代码是“shipping”服务的一部分,您可以通过仅更改一个服务来更改客户端中发生的响应…

因此,当您的事件已被处理并作为下一个聚合版本持久化时,您会通知web客户端?因为您可以使信号集线器/持久连接订阅事件,当消息到达时,可以在正确的客户端上调用Javascript函数。这是我的计划。假设你在购物车中添加了一个触发折扣或其他东西,你可能会订阅更正的总金额消息,并用更新的数据更新该客户机。好的,我已经制定了一个解决方案。我们创建了一个更改通知订阅,您可以在其中告诉订阅返回了什么DTO(这样您就可以返回特定于用户的结果更改)。如果更改过程长时间运行,我们可以使用推送库(web套接字或其他)在更改完成时通知客户端。如果是短时间运行,则进行更改并将其持久化到事件中,然后创建结果DTO并将其返回给用户。谢谢你的投入,它真的帮助我走上正轨。听起来你手头上有疑问,而不是命令。当我订购一件缺货的商品时,从业务角度看会发生什么?你不打算把它卖给我?我想如果产品以某种方式停产(不能延期订购),你不能,但这几乎不是常见的情况,是吗#ReflectionWhilereReadingYourQuestion计算销售税听起来像是一个可重用的库,如果它是同一技术,那么服务器端和客户端都可以使用。客户端还可以使用某种远程外观查询库,而无需改变系统的状态。我需要命令,因为我需要持久化值。然而,我们的用户必须根据BL中的计算值做出决定。也许要澄清一下,我的情况就像进行了许多类似于销售税的计算,并且由于这些计算而产生了计算结果。对于长时间运行的流程,我同意需要进行查询。不想扮演魔鬼的代言人,但魔鬼总是在细节中(常见/不常见)。对于短时间运行的命令,您的解决方案意味着我需要执行一个命令和查询,而不保证在该点上已达到持久性或每个计算的服务器调用。。。如果最终用户根据计算值做出决策,那么这就是一个查询。如果您希望将计算结果存储为命令的一部分,则频谱将移向“我是否信任使用计算数据发出的命令”。在处理命令的过程中进行计算的动机是什么?与作为查询进行计算的动机不同,查询的结果会被塞进命令中并最终持久化?购物车只是一个例子,在我的场景中,我必须发布已提交的更改。将BL烘焙到UI中意味着您必须加载覆盖整个实体范围的模块,而不是DTO(对于我们和许多其他人来说,这会让人害怕)。我们已经确定,有一些长时间运行的流程,除非使用类似于MikaelÖstberg在这里发布的解决方案,否则很难往返到服务器。我正在准备发布一个解决方案,用户可以选择订阅可用的更改。