2015-07-14 2 views
11

Я начинаю с DDD, и вы можете представить, как мой мозг кипит.DDD, сущности домена/VO и JPA

Мой вопрос связан с моими объектами домена (сущностями, VO, ...), которые представляют собой мои концепции/логику домена и как их сохранять/извлекать.

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

Затем я вижу этот пример Spring-data-jpa http://spring.io/guides/gs/accessing-data-jpa/, и я становлюсь сумасшедшим.

Под слоганом сказано, что Spring-data-jpa - это создание репозиториев, и предыдущие образцы объединяют аннотации JPA в объект домена (customer).

Правильно ли образец? или я прав?

Если я прав, а домен и инфраструктура должны быть разделены, это означает, что для хранения клиента я должен иметь:

  • Customer класс в моем домене слоя (который представляет клиента и имеет все логические операции)
  • CustomerRepository ипа мой домен слой (который извлекает или хранит клиент от уровня инфраструктуры)
  • Customer класса в уровне инфраструктуры, вероятно, с аннотацией @Entity
  • Некоторые CustomerReposityJPA, которые знают, как хранить/извлекать клиентов из базы данных.

Благодарим за любые разъяснения.

+0

какой DDD означает? – vels4j

+0

Домен управляемого дизайна. –

ответ

2

Я не вижу ссылку, которую вы опубликовали, и я никогда не применяю проект, ориентированный на домен, в мир Java. Теоретически, что вам нужно, это Customer агрегат в доменном слое. В вашем доменном слое есть место для репозитория (предназначенного как интерфейс), поэтому у вас будет ICustomerRepository. Вероятно, вы будете иметь четыре прототипа для общих вопросов настойчивости:

GetById(CustomerId id); 
Add(Customer c); 
Delete(Customer c); 
Update(Customer c); 

В слое инфраструктуры вы обеспечите организм (например CustomerRepository), в infrastracture слое вы можете пару себя с чем-то технологическим (например, JPA).

Уровень домена ДОЛЖЕН быть полностью не осведомлен о технологии, используемой в инфраструктуре. При этом вы можете полностью изменить детали реализации (почти) никаких проблем.

+0

Кто-нибудь действительно видел пример проекта, который делает это? Кажется, я не могу найти образцы, которые фактически имеют объекты домена (не обязательно связанные с таблицами БД), смоделированные на уровне домена, а затем на уровне инфраструктуры, объекты JPA @Entity, которые сопоставляются с таблицами db. Интерфейсы репозитория должны быть реализованы в этом модуле инфраструктуры и должны знать, как сопоставлять между объектами JPA в моделях домена. – Mustafakidd

10

В DDD репозиторий - это объект, который участвует в домене, но действительно абстрагирует некоторые хранилища резервных копий.

Если вы аннотируете свои объекты домена с помощью аннотаций JPA, ваш механизм персистентности попадает в ваш домен. Вы привязали свою структуру домена к своей структуре персистентности, которая не идеальна.

Ваш JpaCustomerRepository (реализует ICustomerRepository) может отображать неаннотированные классы домена (Customer) в аннотированное представление JPA - клиент JPA.Это позволяет сохранить аннотации из ваших классов домена, поэтому чище. Это позволяет вам изменять структуру сохранения JPA независимо от вашей структуры домена. Стоимость этого преимущества - сложность кода отображения.

interface ICustomerRepository {} 

class JpaCustomerRepository implements ICustomerRepository { 
    void save(Customer customer) { 
      JpaCustomer jpaCustomer = map(customer); 
      save(jpaCustomer); 
    } 
} 

class Customer {} 

class JpaCustomer {} 
+3

Стоимость высокая, есть дублирование кода: два класса клиентов, свойства которых необходимо сопоставить. Звучит как много шаблонов. Насколько вероятна замена поставщика JPA для оправдания дополнительных усилий? –

+1

Я рассматриваю JPA Annotations как декларативную информацию. В случае, если вам нужно заменить поставщика JPA, насколько трудно удалить аннотации JPA от ваших доменных объектов? – Armando

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