DDD с учетом хранилищ и услуг для юридических лиц - PullRequest
0 голосов
/ 29 марта 2020

Я знакомлюсь с DDD и пытаюсь понять, как Entities и Aggregate Roots взаимодействуют.

Ниже приведен пример ситуации:

Предположим, что есть пользователь, и у него / нее есть несколько адресов электронной почты (может иметь до 200 для пример). Каждый адрес электронной почты имеет свою личность, как и пользователь. И есть one to many связь между пользователями и их электронной почтой.


Из приведенного выше примера я рассматриваю Users и Emails как две сущности, а Users - это aggregate root

DDD Правила, с которыми я столкнулся:

  • Правило: Только aggregate root имеет доступ к хранилищу.

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

  • Правило: Entities вне aggregate может получить доступ только к другим entities в aggregate через aggregate root.

Вопрос 2: Теперь рассмотрим, как я делю их на две разные таблицы / коллекции и связываю электронные письма, имея поле в электронном письме под названием associatedUserId содержит ссылку на пользователя, которому принадлежит электронная почта. Я не могу напрямую иметь конечную точку API, такую ​​как /users/{userId}/emails, и обрабатывать ее напрямую в EmailService.getEmailsByUserId(String userId)? Если нет, то как мне смоделировать это?

Извините, если вопрос кажется слишком наивным, но я не могу понять это.

1 Ответ

1 голос
/ 30 марта 2020

Только агрегат root имеет доступ к хранилищу

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

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

Еще в 2003 году использование реляционных баз данных в качестве книги записей было обычным явлением; отношения один ко многим обычно включают несколько таблиц в одной базе данных.

Объекты вне агрегата могут получать доступ только к другим объектам в агрегате через агрегат root.

Я не могу напрямую иметь конечную точку API, такую ​​как / users / {userId} / emails и обрабатывать ее напрямую в EmailService.getEmailsByUserId (String userId)?

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

Перспектива: Эванс выступал против идеи что приложение должно иметь возможность напрямую манипулировать произвольными объектами в доменной модели. Вместо этого приложение должно быть разрешено только сущностям "root" в модели домена. Фактически, это ограничение означает, что приложению на самом деле не нужно понимать ограничения, которые разделяются несколькими сущностями.

Через четыре или пять лет появилась , что еще больше уточнить эту идею - оказывается, что в случаях использования только для чтения модель предметной области не обязательно вносит большой вклад; вам не нужно беспокоиться об инвариантах, если они уже выполнены, и вы ничего не меняете.

Фактически это означает, что GET /users/{userId}/emails может просто извлекать данные из представления, доступного только для чтения, без необходимости вообще задействовать модель предметной области. Но POST /users/{userId}/emails необходимо продемонстрировать первоначальный подход (то есть нам нужно изменить данные с помощью модели предметной области)

означает ли это, что мне нужно сначала go в UserRepo и вытащить пользователь, а затем вытащить электронные письма, я не могу просто сделать EmailService, напрямую разговаривающего с почтовым репо

В оригинальном тексте Эванса репозитории предоставляют доступ к root сущностям , а не произвольные объекты. Так что, если «электронная почта» является сущностью в «совокупности пользователей», то обычно у нее не будет собственного репозитория.

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

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

...