Domain driven design 复制聚合:为什么不应该';我们是否也复制存在于聚合边界之外的对象?

Domain driven design 复制聚合:为什么不应该';我们是否也复制存在于聚合边界之外的对象?,domain-driven-design,Domain Driven Design,当应用程序希望基于现有聚合创建新聚合时,我们可以将现有聚合中的所有内容(内部实体的ID除外)复制到新聚合中。但是,如果某些内部对象引用聚合边界之外的对象,则不允许我们也复制引用的对象 a) 我知道聚合应该关注自己的业务,不要干扰其他聚合的生命周期,但是,如果我们还复制了聚合边界之外的对象,那么到底会有什么问题呢?假设您有一个聚合订单,其中包含订单行对象的集合,并且您希望基于现有订单创建一个新订单,那么您只会复制订单及其关联的订单行。即使订单行可能引用了产品,您也不会复制该产品,因为它不是聚合的一

当应用程序希望基于现有聚合创建新聚合时,我们可以将现有聚合中的所有内容(内部实体的ID除外)复制到新聚合中。但是,如果某些内部对象引用聚合边界之外的对象,则不允许我们也复制引用的对象


a) 我知道聚合应该关注自己的业务,不要干扰其他聚合的生命周期,但是,如果我们还复制了聚合边界之外的对象,那么到底会有什么问题呢?

假设您有一个聚合
订单
,其中包含
订单行
对象的集合,并且您希望基于现有订单创建一个新订单,那么您只会复制订单及其关联的订单行。即使订单行可能引用了
产品
,您也不会复制该产品,因为它不是聚合的一部分


理想情况下,订单行甚至不应该有对产品实例的引用,而应该只保存产品id


正如eulerfx所提到的,复制背后的原因可能会给我们带来更多的启示:)

您能提供一个更具体的例子吗?@eulerfx:这不是一个一般规则,不管我们有什么类型的域模型吗(至少我是这样理解《DDD:解决复杂性》的作者的…-他从来没有明确说过,但我认为他暗示了这一点)?例如,我要求的原因是从您的域中收集可能会影响答案的内容。复制聚合不是DDD中明确包含的内容,因此在您的情况下可能会有一些警告。您当然可以将引用复制到外部对象,因为这些只是引用,不会影响aggreg的事务完整性ate。然而,有趣的是复制的原因。它可能会影响复制对象的完整性,这取决于该对象是什么。这就是为什么复制的性质很重要——它取决于复制的内容和原因。“理想情况下,订单行甚至不应该引用产品实例,而应该只保留产品id。”我理解聚合应确保其自身聚合中没有违反一致性规则,但您认为引用产品会以某种方式违反聚合的任何一致性规则吗?这并不是说引用产品会破坏一致性规则,而是要创建一个具有良好一致性的非常独特的AR精细边缘。事实上,在订单行上有某种产品/服务是一致性的要求。“事实上,在订单行上有某种产品/服务是一致性的要求。”您能否详细说明为什么需要在订单行上放置产品以保持一致性?…订单行通常被定义为数量可能包含额外数据的产品。因此,要使订单行保持一致,它必须引用产品,否则就没有指向它的意义。