6

看过 Greg Yound 在 DDD 上的这个视频

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

我想知道当内存发生变化时,如何使用 DDD 实现命令查询分离 (CQS)?

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

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

您能否在 ASP.NET 中将 CQS 与类似和编辑屏幕一起使用,其中在内存中进行了更改,并且在将更改持久化到数据库之前需要多次更新屏幕?

例如

  1. 我从查询存储库中获取查询对象并将其显示在屏幕上
  2. 我点击编辑
  3. 我从查询对象存储库中重新获取查询对象并以编辑模式将其显示在表单上
  4. 我更改了表单上的一个值,该值自动回传并获取命令对象并发出相关命令
  5. 做什么:我现在需要在命令更改计算字段时显示更新的对象。由于命令对象尚未保存到数据库中,我无法使用查询存储库。而对于 CQS,我并不是要公开命令对象的形状以显示在屏幕上。您将如何通过更新的更改返回查询对象以显示在屏幕上。

我能想到的几个可能的解决方案是拥有一个会话存储库,或者一种从命令对象获取查询对象的方法。还是 CQS 不适用于此类场景?

在我看来,视频中的更改会直接保存到数据库中,而且我还没有找到一个使用 CQS 的 DDD 示例来解决对域对象进行批量更改和更新修改后域对象的视图的问题最后发出命令来保存域对象。

4

6 回答 6

3

所以听起来你想要的是一个更精细的命令。

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

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

表示模型对于抽象这种类型的交互很有帮助。

希望这可以帮助。

格雷格

于 2009-11-16T09:12:48.390 回答
1

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

于 2009-10-04T03:30:16.320 回答
1

也为您的其他顾虑...

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

于 2009-11-16T09:17:11.720 回答
0

在内存中,您通常会使用观察者设计模式

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

于 2009-09-25T12:09:43.683 回答
0

来自企业应用程序架构模式工作单元设计模式与 CQS 非常匹配——它基本上是一个将内容保存在数据库中的大命令。

于 2009-09-27T10:56:10.487 回答
-2

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

于 2009-12-24T06:22:56.173 回答