如何在内存中实现CQS更改?

时间:2009-09-25 11:57:50

标签: domain-driven-design repository-pattern cqrs

观看了Greg Yound关于DDD的视频

http://www.infoq.com/interviews/greg-young-ddd

我想知道如何在内存更改时使用DDD实现命令查询分离(CQS)?

使用CQS,您有两个存储库,一个用于命令,一个用于查询。 以及两个对象组,命令对象和查询对象。 命令对象只有方法,没有可以公开对象形状的属性,不能用于在屏幕上显示数据。 另一方面,查询对象用于向屏幕显示数据。

在视频中,命令总是转到数据库,因此您可以使用查询存储库来获取更新的数据并在屏幕上重新显示。

您是否可以在ASP.NET中使用CQS并编辑屏幕,在内存中进行更改并且在将更改保留到数据库之前需要使用更改多次更新屏幕?

例如

  1. 我从查询存储库中获取查询对象并将其显示在屏幕上
  2. 我点击修改
  3. 我从查询对象存储库中重新获取查询对象,并在编辑模式下将其显示在表单上
  4. 我更改了表单上的值,该值自动恢复并获取命令对象并发出相关命令
  5. 做什么:我现在需要显示更新的对象,因为命令对计算的字段进行了更改。由于命令对象尚未保存到数据库,因此无法使用查询存储库。而使用CQS,我并不是要公开要在屏幕上显示的命令对象的形状。如何通过屏幕上显示的更新更改来获取查询对象。
  6. 我能想到的几个可能的解决方案是拥有会话存储库,或者从命令对象获取查询对象的方法。 或者CQS不适用于这种情况吗?

    在我看来,视频中的更改会直接传递到数据库,我还没有找到一个带有CQS的DDD示例,它解决了对域对象进行批量更改和更新已修改视图的问题最终发出命令以保存域对象之前的域对象。

6 个答案:

答案 0 :(得分:3)

所以你想要的是一个更细粒度的命令。

EG:用户与网页互动(假设用购物车结账)。

获取信息的多个页面正在构建命令。在用户实际检出所有信息在单个命令中发送到域的位置之前,该命令不会被发送,我们称之为“CheckOut”命令。

演示模型非常有助于抽象这种类型的互动。

希望这有帮助。

格雷格

答案 1 :(得分:1)

如果你真的想为此使用CQS,我会说Query repo和Write repo都引用了同一个后备存储。通常这个引用是通过外部数据库 - 但在你的情况下,它可以是List< T>或类似的。

答案 2 :(得分:1)

还有其他问题......

与CQRS相比,这些更关注最终的一致性。您不需要最终与CQRS保持一致,您可以使命令的处理也以一致的方式写入报告存储(或者如上所述使用相同的物理存储)。我实际上建议人们这样做作为他们的基础架构,然后在需要时引入并引入最终的一致性,因为它与成本相关联。

答案 3 :(得分:0)

在内存中,您通常会使用Observer design pattern

实际上,您总是希望使用此模式,但是当数据库中的某些内容发生更改时,大多数数据库都不提供在应用程序中调用方法的有效方法。

答案 4 :(得分:0)

来自Unit of WorkPatterns of Enterprise Application Architecture设计模式与CQS非常匹配 - 它基本上是一个在数据库中保留内容的大型命令。

答案 5 :(得分:-2)

JdonFramework是CQRS DDD java框架,它提供域事件+异步模式,更多细节https://jdon.dev.java.net/

相关问题