DDD: ссылка на сущность внутри совокупного корня по его идентификатору - PullRequest
9 голосов
/ 05 сентября 2011

Я застрял в поиске правильного способа обращения к сущностям , находящимся внутри совокупного корня , когда мы получили только их идентификаторы из параметров URL , Я задал предыдущий вопрос , который в конечном итоге сфокусировался на объектах значений , поэтому я начинаю с другого примера здесь.

Допустим, мы хотим изменить OrderLine внутри Order:

  • Пользователь переходит на страницу, где он может видеть сводку заказа вместе со всеми его строками заказа.
  • Пользователь нажимает кнопку edit рядом со строкой заказа.
  • Он получает указание на edit-order-line?orderId=x&orderLineId=y

Теперь, если мне нужно обновить количество в OrderLine, я могу сделать:

Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);

Тем не менее, я не чувствую себя очень комфортно с мыслью о том, чтобы передать Ордену ответственность за получение его частей по Ид. Мой взгляд на эту тему заключается в том, что внутри домена мы должны просто общаться с объектами , а не с идентификаторами. Идентификаторы не являются частью вездесущего языка , и я считаю, что они должны находиться за пределами домена, например, в Controller.

Я бы чувствовал себя более уверенно с чем-то вроде:

Order order = orderRepository.find(orderId);
OrderLine orderLine = em.find(OrderLine.class, orderLineId);
order.updateQuantity(orderLine, 2);

Хотя мне и не нравится идея взаимодействия напрямую с Entity Manager. Мне кажется, что я обхожу обязанности репозитория и совокупного корня (потому что я мог бы , потенциально, напрямую взаимодействовать с OrderLine).

Как вы обходите это?

Ответы [ 3 ]

12 голосов
/ 05 сентября 2011

По моему мнению, в этом подходе нет ничего плохого:

Order order = orderRepository.find(orderId);
order.updateQuantity(orderLineId, 2);

orderLineId - это «локальная идентичность».Он специфичен для агрегатного корня и не имеет смысла вне его.Вам не нужно называть это «id», это может быть «номер строки заказа».Из книги Эрика Эвана:

СУЩНОСТИ внутри границы имеют локальную идентичность, уникальную только в пределах СУЩЕСТВА.

... напрямую могут быть получены СУЩЕСТВЕННЫЕ корнис запросами к базе данных.Все остальные объекты должны быть найдены путем обхода ассоциаций.

1 голос
/ 20 ноября 2011

OrderLineId - это что именно? Это не имеет смысла. Вы обновляете количество ПРОДУКТА, и это то, что следует использовать в качестве идентификатора.

Order order = orderRepository.find(orderID);
order.updateQuantity(productID, 2);
0 голосов
/ 05 сентября 2011

Совокупные корни привязаны к контексту, в вашем контексте Порядок равен AR, поэтому можно обновить его напрямую, поскольку вы выставляете напрямую, если этот код влияет на другиесущности они должны жить в Ордене АР.

Если вы хотите более пуристический подход, вам нужно либо создать findByOrderId в AR и загрузить его целиком, либо выставить OrderLine и OrderId в вашем приложении (затем используя второй подход).

...