我在解决应对相当复杂的情况的最佳方法时遇到了一些困难。我已经看到了很多类似的问题,但是没有一个令我满意。

使用多个OrderLine(子实体)创建一个Order(集合根)。根据业务规则,每个OrderLine必须在Order的整个生命周期内保持相同的身份。 OrderLine具有许多(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的引用,以进行不影响不变量的修改,并针对那些不影响不变性的订单进行检查。但是,如果不变性受大多数OrderLine属性的影响,那该怎么办呢?这个异议是假设的,因为只有少数几个属性会影响不变量,但是随着我们发现更多的业务逻辑,情况会发生变化。

任何建议都值得赞赏...如果我很稠密,请随时让我知道。

最佳答案

  • 不是最佳的,因为它允许打破域不变性。
  • 将导致代码重复和不必要的方法爆炸。
  • 与1)相同。使用值对象将无助于维护域不变性。
  • 这个选项是我想要的。在实现之前,我也不会担心潜在的和假设的变化。设计将随着您对领域的了解而发展,并且以后可以随时进行重构。为了将来可能不会发生的某些更改而阻碍现有设计确实没有任何值(value)。
  • 关于domain-driven-design - DDD-聚合中子对象的修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10728187/

    10-12 07:36