У меня возникли трудности с разработкой наилучшего способа обработки довольно сложного сценария. Я видел довольно много подобных вопросов, но никто не обращался к этому сценарию с удовлетворением.
Порядок (совокупный корень) создается с помощью нескольких OrderLines (дочерних сущностей). Согласно бизнес-правилам, каждая OrderLine должна поддерживать ту же идентичность для жизни Ордена. OrderLines имеют много свойств (20+) и могут быть мутированы довольно часто до того, как Порядок считается "заблокированным". Кроме того, существуют инварианты, которые должны выполняться на корневом уровне; например, каждая строка заказа имеет количество, а общая величина для ордера не может превышать 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 как объект Value, но он должен поддерживать идентичность для бизнес-требований.
4) Я могу получить ссылки на OrderLines для модификаций, которые не влияют на инварианты, и пройти через Order для тех, которые делают. Но что, если на инварианты влияет большинство свойств OrderLine? Это возражение гипотетично, поскольку только некоторые свойства могут влиять на инварианты, но это может измениться, поскольку мы раскрываем больше бизнес-логики.
Любые предложения приветствуются... не стесняйтесь сообщать мне, плотно ли я.