我在处理一个相当复杂的情况时遇到了一些困难。我看到过很多类似的问题,但没有一个能满足我的需求。
一个订单(聚合根)会创建多个订单行(子实体)。根据业务规则,每个订单行必须在整个订单生命周期内保持相同的标识。订单行有许多(20+)属性,并且在订单被“锁定”之前可能经常发生变化。此外,在根级别必须执行不变量;例如,每个订单行都有一个数量,订单的总数量不能超过X。
当考虑对订单行进行更改时,我不确定如何对此场景进行建模。我想到了4种选择,但似乎都不太令人满意:
1) 当需要修改订单行时,请使用根提供的引用进行修改。但我失去了在根中检查不变逻辑的能力。
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属性都会影响不变量怎么办?这个反驳是假设性的,因为只有少数属性会影响不变量,但是随着我们发现更多的业务逻辑,情况可能会改变。
非常感谢您给出的任何建议...请毫不犹豫地告诉我是否理解得不够透彻。