2

假设我们有它存储在表层次深三个层次在我们的领域这样的集合体。我们将域对象表示为Order - OrderItems - ItemAttributes。我们还假设我们在数据层使用了Repository模式。越来越沉重聚集的名单

库包含方法GetAll返回的Orders上市。

我们遵循REST我们的服务层上,因此,我们使用

  • GET /orders获得上市
  • GET /orders/{Id}得到具体Order

上市只包含基本字段每个Order没有细节,但是,通过id查询返回更大的对象。

作为一个Order物化是昂贵的操作,我们不喜欢的事实,我们得到充分的聚集只是一对夫妇的字段发送到客户端。另一方面,我们尝试遵循合理的规则,即知识库必须仅返回完全初始化的聚合。

我们怎么能解决这个难题?

+1

一个字:CQRS http://www.sapiensworks.com/blog/post/2013/05/04/CQRS-Explained.aspx – MikeSW

回答

2

除了CQRS别人的建议,将一个简单的Lazy loading是一个很好的解决这个问题呢?如果订单项未被访问,它们将不会被加载。或者如果您不能使用延迟加载,则需要专门的OrderSummary/OrderStatus域对象?

此外,它始终是值得重新考虑是否真的需要一个重集。可能根本没有要求它的域规则。例如生命周期是一个众所周知的“错误的原因”,因为有大量的聚合(像Group-> User或Product-> BacklogItem)。强烈建议阅读此主题:Aggregate design

+0

延迟加载的问题是我已经使用Order-OrderItems进行了简化: - )在这个聚合中实际上有很多事件驱动的逻辑,它检查整个层次结构。感谢您的链接,我一定会尝试阅读您的建议。 – starteleport