我在找出处理相当复杂的场景的最佳方法时遇到了一些困难。我见过很多类似的问题,但没有一个让我满意。
使用多个 OrderLine(子实体)创建一个 Order(聚合根)。根据业务规则,每个 OrderLine 必须在 Order 的生命周期内保持相同的身份。OrderLines 有许多 (20+) 属性,并且在 Order 被视为“锁定”之前可以经常发生突变。此外,还有一些必须在根级别强制执行的不变量;例如,每个订单行都有一个数量,订单的总数量不能超过 X。
在考虑对 OrderLines 进行更改时,我不确定如何对这种情况进行建模。我有 4 个我能想到的选择,但似乎没有一个令人满意:
1) 当需要修改 OrderLine 时,请使用根提供的参考。但是我失去了检查根中不变逻辑的能力。
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 属性的影响怎么办?这个反对是假设的,因为只有少数属性可以影响不变量,但是随着我们发现更多的业务逻辑,这可能会改变。
任何建议表示赞赏......如果我很密集,请随时告诉我。