【发布时间】:2016-02-29 11:26:39
【问题描述】:
在 DDD 中,聚合根通过存储库进行持久化。但是存储库是唯一可以在有界上下文中触及持久性的类吗?
我在 DDD 旁边使用 CQRS。在查询方面,诸如视图计数、赞成票之类的东西需要持久化,但我觉得将它们建模为聚合根很尴尬。我将 DDD 聚合根建模限制在命令端。查询端不允许使用存储库。但是查询端经常要求少量的持久化能力。
另外,我正在使用域事件,某些域事件也需要持久化。我需要一种叫做事件存储的东西,但我只听说事件溯源 (ES) 中出现了这样的术语,我没有使用 ES。
如果确实需要这样的持久类。如何称呼它们,它们应该属于哪一层?
[更新]
当我阅读下面的答案时,我意识到我的问题有点模棱两可。 我主要指的是写(也包括读)。
谢谢。
【问题讨论】:
-
我相信你需要务实而不是教条。如果您需要保存事件,请保存事件。您不需要存储库,因为存储库仅用于聚合。您可以将事件发送到消息总线中,并将它们保存在某个单独的进程中。但确实查询是查询,默认情况下它们不能保存任何东西,除非你想在那里记录一些东西。查询是幂等的,它们不会改变状态并且没有副作用。
-
@AlexeyZimarev 我理解你所说的保存事件。我也明白查询不应该改变状态。但是那些改变状态但难以将它们建模为聚合根中的值对象的东西呢?比如视图计数和赞成票?
-
@AlexeyZimarev 也许这种与统计相关的东西应该在一个单独的有界上下文中?在这种情况下,我可以使用更简单的架构(即事务脚本)来管理赞成票和查看次数。
-
如果不能看到您的域是什么,就很难说什么。如果您接受 SO,则赞成票是问题和答案的重要属性。你有什么——我不知道。如果您觉得将它们作为聚合的一部分很尴尬,可能应该将它们取出。
标签: repository domain-driven-design aggregateroot