DDD - Модификации дочерних объектов внутри агрегата

У меня возникли некоторые трудности с поиском лучшего способа справиться с довольно сложным сценарием. Я видел довольно много похожих вопросов, но ни один не ответил на этот сценарий удовлетворительно.

Приказ (совокупный корень) создается с несколькими OrderLines (дочерними объектами). Согласно бизнес-правилам, каждая OrderLine должна поддерживать одну и ту же идентичность на протяжении всего срока существования Order. 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? Это возражение является гипотетическим, поскольку лишь несколько свойств могут влиять на инварианты, но они могут меняться по мере того, как мы раскрываем больше бизнес-логики.

Любые предложения приветствуются... не стесняйтесь, дайте мне знать, если я туплю.

11
задан Cork 23 May 2012 в 21:32
поделиться