Мне трудно найти лучший способ справиться с довольно сложным сценарием. Я встречал довольно много похожих вопросов, но ни один из них не отвечал мне удовлетворительно по этому сценарию.
Заказ (совокупный корень) создается с несколькими строками заказа (дочерними объектами). Согласно бизнес-правилам, каждая линия OrderLine должна сохранять идентичность на протяжении всего срока действия заказа. 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? Это возражение является гипотетическим, поскольку только несколько свойств могут влиять на инварианты, но это может измениться по мере раскрытия большей бизнес-логики.
Любые предложения приветствуются ... не стесняйтесь, дайте мне знать, если я говорю недобросовестно.