域驱动设计 – DDD – 修改聚合中的子对象

前端之家收集整理的这篇文章主要介绍了域驱动设计 – 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对象不会有助于维护域不变. >这个选项是我会去的.我也不会担心潜在的和假设的变化,直到它们实现.设计将随着您对领域的理解而发展,并且可以随时重构.为了将来可能没有发生的变化,确实没有阻碍现有设计的价值.
原文链接:https://www.f2er.com/javaschema/281404.html

猜你在找的设计模式相关文章