域驱动设计 – DDD – 修改聚合中的子对象
我有一些困难处理一个相当复杂的场景的最佳方法.我已经看到了很多类似的问题,但是没有人解决这个情况令我满意.
使用多个OrderLines(子实体)创建一个订单(聚合根).根据业务规则,每个OrderLine必须在订单的生命周期内保持相同的身份. OrderLines有许多(20)属性,并且可以在订单被视为“锁定”之前相当频繁地变异.另外还有一些必须在根层面执行的不变量;例如,每个订单行都有数量,订单的总数不能超过X. 在考虑对OrderLine的更改时,我不知道如何对这种情况进行建模.我有4个选择,我可以设想,但没有看起来令人满意: 1)当修改OrderLine的时候,请使用root提供的引用.但是我失去了在根中检查不变逻辑的能力. var orderLine = order.GetOrderLine(id); orderLine.Quantity = 6; 2)在订单上调用方法.我可以应用所有不变的逻辑,但随后我被扩散的方法来修改OrderLine的许多属性: order.UpdateOrderLineQuantity(id,6); order.UpdateOrderLineDescription(id,description); order.UpdateOrderLineProduct(id,product); ... 3)如果将OrderLine视为值对象,则可能会更容易,但是每个业务需求必须保持相同的身份. 4)我可以获取对OrderLines的引用,以便对不影响不变量的修改进行修改,然后通过Order命令.但是,如果不变量受大多数OrderLine属性影响呢?这个反对是假设的,因为只有几个属性可以影响不变量,但是随着我们发现更多的业务逻辑,这可能会改变. 任何建议都赞赏…不要犹豫,让我知道,如果我很密集.
>不是最优的,因为它允许破坏域不变. >将导致代码复制和不必要的方法爆炸. >与1)相同.使用Value对象不会有助于维护域不变. >这个选项是我会去的.我也不会担心潜在的和假设的变化,直到它们实现.设计将随着您对领域的理解而发展,并且可以随时重构.为了将来可能没有发生的变化,确实没有阻碍现有设计的价值.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |