かなり複雑なシナリオを処理するための最良の方法を見つけるのに少し苦労しています。私はかなりの数の同様の質問を見てきましたが、満足のいくようにこのシナリオに対処したものはありませんでした。
Order(集約ルート)は、複数のOrderLine(子エンティティ)で作成されます。ビジネスルールに従って、各OrderLineは、注文の存続期間中、同じIDを維持する必要があります。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を値オブジェクトとして扱った方が簡単かもしれませんが、ビジネス要件ごとに同じIDを維持する必要があります。
4)不変条件に影響を与えない変更については、OrderLinesへの参照を取得し、影響を与える変更についてはOrderを調べることができます。しかし、不変条件がほとんどのOrderLineプロパティの影響を受ける場合はどうなるでしょうか。不変条件に影響を与える可能性のあるプロパティはごくわずかであるため、この異論は仮説ですが、ビジネスロジックが明らかになるにつれて、状況は変化する可能性があります。
任意の提案をいただければ幸いです...私が密集している場合は、遠慮なくお知らせください。