DDD: поддержание ограничений для агрегатов

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

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

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

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

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

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

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

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

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

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

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

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

Обновление 1:

Только что понял, что это, вероятно, связанный вопрос: Как следует Я навязываю отношения и ограничения между совокупными корнями?


person 9ee1    schedule 29.03.2012    source источник


Ответы (1)


Из книги DDD, стр. 128:

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

Теперь сначала вам нужно выяснить это для себя, с экспертами в вашей предметной области, какое из этих правил является истинным инвариантом, то есть - оно должно быть немедленно составлено. Если есть такое правило, оно должно выполняться корнем агрегата, и в этом случае вы можете подумать о слиянии этих двух агрегатов в один. Если такого правила нет, то, как указано выше, подойдет конечная согласованность. Для этой цели вы можете рассмотреть Доменные События. см. запись Уди Дахана

person ItzikSaban    schedule 29.03.2012