假设我们的域中有这样一个聚合,它存储在三层深度的表层次结构中。我们将域对象表示为Order
- OrderItems
- ItemAttributes
。
我们还假设我们在数据层使用Repository模式。
存储库包含方法GetAll
,它返回Orders
。
我们在服务层上遵循REST,因此,我们使用
GET /orders
获取商家信息GET /orders/{Id}
获取具体的Order
该列表仅包含每个Order
的基本字段,但没有详细信息,但是,按id查询会返回更大的对象。
由于一个Order
的实现是一项昂贵的操作,我们不喜欢这样一个事实:我们只是为了向客户端发送一些字段而得到完整的聚合。另一方面,我们尝试遵循合理的规则,即存储库必须仅返回完全初始化的聚合。
我们怎样才能解决这个难题?
答案 0 :(得分:2)
除了其他人建议的CQRS之外,一个简单的Lazy loading是否可以很好地解决这个问题?如果未访问订单商品,则不会加载订单商品。如果你不能使用延迟加载,还是专用的OrderSummary / OrderStatus域对象?
同样值得重新考虑是否确实需要重型骨料。可能根本没有域规则要求它。例如,生命周期是具有重聚合的众所周知的“错误理由”(例如Group-> User,或Product-> BacklogItem)。强烈推荐阅读此主题:Aggregate design。