我在處理相當複雜的場景時遇到了一些困難。我看到了很多類似的問題,但沒有一個能夠滿足我的需求。DDD - 聚合內子對象的修改
訂單(聚合根)使用多個OrderLines(子實體)創建。根據業務規則,每個OrderLine必須在訂單的生命週期中保持相同的身份。 OrderLines有很多(20+)屬性,並且在訂單被視爲「鎖定」之前可以經常發生突變。另外,還有一些不變量必須在根層次上執行;例如,每個訂單行都有一個數量,訂單的總數量不能超過X.
我不確定如何在考慮對OrderLines進行更改時對此業務情景建模。我有4個可以想象的選擇,但沒有一個看起來令人滿意:
1)當需要修改OrderLine時,請使用根提供的參考。但是我失去了檢查根中的不變邏輯的能力。
var orderLine = order.GetOrderLine(id);
orderLine.Quantity = 6;
2)調用訂單上的方法。我可以將所有不變的邏輯,但後來我堅持用的方法增殖修改訂單行的許多特性:
order.UpdateOrderLineQuantity(id, 6);
order.UpdateOrderLineDescription(id, description);
order.UpdateOrderLineProduct(id, product);
...
3)如果我處理的訂單行的值對象,這可能是更容易,但它必須保持每個業務需求的相同身份。
4)我可以獲取對OrderLines的引用,以進行不影響不變量的修改,並通過訂單處理。但是,如果不變量受到大多數OrderLine屬性的影響呢?這種反對是假設的,因爲只有少數屬性會影響不變量,但是隨着我們發現更多的業務邏輯,這個屬性可能會發生變化。
任何建議表示讚賞...不要猶豫,讓我知道如果我密集。
謝謝你的回答 - 我認爲這可能是我提出的最佳選擇。我實際上希望有人提出一個我可能忽略的更好的模式;)我對使用它有點懷疑,因爲它不乾淨。或者,也許更好的方法是......不一致,就像@eulerfx指出的那樣。但我想現在會做... – Cork
我知道我已經接受這個答案了......但我想到了一種不同的方法。在訂單上有一個Save(IOrderLine)方法可以嗎?然後我可以傳遞給訂單,避免一堆細化的方法,並且仍然允許訂單執行不變量。 – Cork