0

Допустим, у меня есть следующий агрегатный Root:Сохранение Совокупные Roots, не подвергая Вложенные сущности

class Order { 
    private Collection<OrderItem> items; 
    ... 
    public void updateQuantity(int itemId, int quantity) { ... } 
} 

И давайте говорить, что я использовать простой SQL упорствовать его. Возникает вопрос: как я сохраняю ордер и его элементы, не подвергая коллекцию? Я вижу несколько способов, которые мне не нравятся:

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

2) Добавить добытчиками для каждого свойства элементов:

class Order { 
     public int getQuantity(int itemId) { ... } 
} 

Это лучше, так как никто не извне, не может изменить вложенные объекты в суперпользователя. Но он может взорвать класс корня кучками манекенов.

3) Используйте путь Hibernate: получите элементы через отражение java в репозитории. Это жульничество". Также я думаю о том, как создать DTO, поэтому мне нужен законный способ прочитать значения.

4) Сделайте поле для использования модификатора по умолчанию и поместите реализацию репозитория (и ассемблер DTO) в тот же пакет, чтобы он имел доступ к полям. Не нравится, потому что реализация репозитория не является частью домена.

Я предпочитаю второй подход, но может быть какой-то другой способ, который мне не хватает?

ответ

0

Я бы выставил коллекцию OrderItem s.

Существует хороший SO question "What is the best practice for read-only lists in NHibernate", где вы можете найти много информации о Как разоблачить коллекции право.

Я не вижу никаких проблем, чтобы скрыть коллекцию OrderItem s как внутреннее состояние. Если вы выставляете метод updateQuantity, тогда должна быть возможность проверить, обновляется ли количество по определенному элементу или нет.

1) Добавить метод, который возвращает скопированную коллекцию. Мне не нравится, , потому что нам нужно делать копии каждого элемента (так как это Сущность и может быть изменено), что является еще одной проблемой самостоятельно.

Фактически, объекты могут быть изменены, и они не являются неизменными. Объекты Value должны быть неизменными.

В вашем примере Orderlooks like root entity or Aggregate Root and OrderItem looks like Entity. It has an identity within an Order at least so it is definitely not a Value Object.

3) Используйте путь гибернации: получить детали через отражение Java в хранилище. Это жульничество". Также я думаю о способе создания DTO, так что мне нужен законный способ для чтения значений.

Некоторых люди используют две моделей:

  • "чистые" Модель предметной области
  • и "грязная база данные зависят" Постоянство модель.

Ну, я не большой поклонник такого подхода. Обычно я пытаюсь сделать свой ORM для создания приличной структуры базы данных на основе модели домена.

2) Добавить добытчик для каждого свойства элементов:

Это лучше, так как никто не извне, не может изменить вложенные объектов в Рута. Но он может взорвать класс корня кучками манекенов.

Для того, чтобы предотвратить их от внешних изменений есть хорошая практика, чтобы не подвергать public сеттеры и держать их private или protected по крайней мере.

+0

Последнее, что я сейчас пойду. Благодаря! –

+0

BTW, OrderItem изменен, но я хочу, чтобы он был изменен только через корень. –

+0

Это нормально, что он изменен, но модификаторы доступа могут ограничивать его для своих клиентов в других слоях (например, презентация) –

Смежные вопросы