2012-03-29 7 views
1

Все еще чтение и изучение DDD и попытка применить его к проекту, над которым я работаю. Я все еще пытаюсь обойти Агрегаты и наткнулся на интересный вопрос.DDD: Сохранение ограничений по совокупности

Предположим, у меня есть 2 Агрегата 1, у которых есть Учетная запись для корня, а другая - для пользователя для корня.

Учетная запись не может быть создана без Пользователя, но пользователь может, поэтому они оба служат в качестве корня их собственных агрегатов. Обратите внимание: их агрегированные объекты включают другие объекты, но это не важно для моего вопроса.

Некоторые бизнес-правила: 1) Когда создается учетная запись, она должна быть связана с пользователем. Если Пользователь не существует, он должен быть сначала создан.

2) Когда Учетная запись удалена, ее ассоциированный Пользователь также должен быть удален.

3) Когда пользователь создан, его не нужно связывать с учетной записью.

3) Когда пользователь удаляется, если он связан с учетной записью, он также должен быть удален.

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

Так что, учитывая эти сценарии, наилучшим способом выполнить следующее: 1) Когда создается учетная запись, я решил, что я буду ссылаться на Свойство «Свойство» для проверки того, что Пользователь обеспечивает его существование. Это правильно?

2) Когда удалена учетная запись, как мне также удалить связанный с ней Пользователь. Из учетной записи? Но не будет ли это дублировать код в репозитории пользователей? Или могут ли репозитории ссылаться и ссылаться друг на друга?

3) Когда пользователь удаляется, что является лучшим способом определить, связано ли оно с учетной записью и удалить ее без дублирования кода (возможно, аналогично второму вопросу).

Я где-то читал, что если логика пересекает две Сущности или Агрегаты, подумайте об использовании Сервиса. Но я не согласен с тем, что останавливает клиента (при условии, что API будет развиваться, а пользователь с другими презентациями в будущем), минуя Сервис и просто вызывая репозитории?

Update 1:

Просто понял, что это, вероятно, связанный с этим вопрос: How should I enforce relationships and constraints between aggregate roots?

ответ

5

Из DDD книги, P128:

Любое правило, которое охватывает АГРЕГАТЫ не будет ожидаться быть в курсе всех событий. Благодаря обработке событий, пакетной обработке или другим механизмам обновления, другие зависимости могут быть разрешены в течение определенного времени.

Теперь, сначала нужно clearify его к себе, с экспертами предметной области, которые из этих правил представляет собой истинный инвариант, то есть - он должен быть немедленно состоял.Если существует такое правило, оно должно быть принудительно введено совокупным корнем, и в этом случае вы можете рассмотреть возможность объединения этих двух агрегатов в один. Если такого правила нет, то, как указано выше, в конечном итоге будет выполняться последовательность. Вы можете рассмотреть события домена для этой цели. см. Udi Dahan's post

Itzik Saban

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