Domain driven design 轻量级聚合和存储库

Domain driven design 轻量级聚合和存储库,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,假设我们有两个简单的域对象: 主题实体->消息值对象 根据DDD原则,这两个域对象可以包含在一个聚合中 但在某些情况下,如果只想显示主题列表,我们需要检索没有消息的主题,有时我们需要检索带有消息的主题 设计这个简单箱子的最佳方法是什么?提前感谢。我建议您将域逻辑与演示所需的数据分开。类似于命令查询分离CQS或命令查询职责分离CQR。例如,如果有人向主题添加新消息,您将创建一个适当的命令,并将其作为域逻辑的一部分进行处理。若您需要在用户界面中显示一些数据,那个么可以通过DTO数据传输对象只选择您真

假设我们有两个简单的域对象: 主题实体->消息值对象

根据DDD原则,这两个域对象可以包含在一个聚合中

但在某些情况下,如果只想显示主题列表,我们需要检索没有消息的主题,有时我们需要检索带有消息的主题


设计这个简单箱子的最佳方法是什么?提前感谢。

我建议您将域逻辑与演示所需的数据分开。类似于命令查询分离CQS或命令查询职责分离CQR。例如,如果有人向主题添加新消息,您将创建一个适当的命令,并将其作为域逻辑的一部分进行处理。若您需要在用户界面中显示一些数据,那个么可以通过DTO数据传输对象只选择您真正需要的数据。此解决方案避免了不必要的数据检索,并有助于保持简单性。您只检索真正需要的数据


如果此解决方案导致项目中发生大量更改,则可以在存储库中创建一个附加方法,该方法返回聚合的轻量级版本,其中包含消息集合的默认存根。但是这种解决方案有一个缺点-您需要记住,这种方法返回的数据不完整。

第二种“轻量级”聚合的变体对我来说很清楚,但我不喜欢“记住一些东西”之类的方法,因为它们往往容易出错。我现在正在调查CQS/CQR。看起来没问题,只是日期应该重复。如果一个主题和消息很大,包含很多字段,那么我必须在DTO中包含这些字段。简单地说,我将再维护一个额外的数据容器。。。