DDD: Maintaining Constraints Across Aggregates
Still reading and learning about DDD and trying to apply it to a project I am working on. I am still trying to get by head around Aggregates and came across an interesting question.
Assume I have 2 Aggregates, 1 having an Account Entity for a root and the other a User Entity for a root.
An Account cannot be created without a User but a User can, that's why they both serve as the root of their own Aggregates. Note, their Aggregates include other entities but that's not important for my question.
Some business rules: 1) When an Account is created, it must be associated with a User. If the User does not exist, it must first be created.
2) When an Account is deleted, its associated User must also be deleted.
3) When a User is created, it does not need to be associated with an Account.
3) When a User is deleted, if it is associated with an Account, it must be deleted as well.
Since Account and User form their own aggregates, there will probably have their own Repositories. Which means the standard Add, Delete, Find, and Delete methods will be defined by each of these Repositories.
So given these scenarios, what is the best way to accomplish the following: 1) When an Account is created, I figured I would invoke a Method on its User's property to validate the User ensuring it exists. Это правильно?
2) Когда удаляется Учетная запись, как мне также удалить ассоциированного Пользователя. Из хранилища аккаунтов? Но не будет ли это просто дублировать код в репозитории пользователей? Или хранилища могут ссылаться и ссылаться друг на друга?
3) Когда пользователь удаляется, как лучше всего определить, связан ли он с учетной записью, а также удалить его без дублирования кода (вероятно, аналогично второму вопросу).
Я где-то читал, что если логика пересекает две сущности или совокупности, подумайте об использовании службы. Но меня это не устраивает, поскольку, что мешает клиенту (при условии, что API будет развиваться, и пользователю в будущем будут представлены другие презентации), чтобы обойти Сервис и просто вызвать Репозитории?
Обновление 1:
Просто понял, что это, вероятно, связанный вопрос: как я должен навязывать отношения и ограничения между совокупными корнями?
1 ответ
Из книги DDD, стр. 128:
Предполагается, что любое правило, охватывающее AGGREGATES, не будет постоянно обновляться. Посредством обработки событий, пакетной обработки или других механизмов обновления другие зависимости могут быть разрешены в течение определенного времени.
Теперь, во-первых, вам нужно прояснить это для себя, вместе с экспертами в своей области, какое из этих правил является истинным инвариантом, что означает - оно должно быть немедленно выполнено. Если есть такое правило, оно должно применяться корнем агрегата, и в этом случае вы можете рассмотреть возможность объединения этих двух агрегатов в один. Если такого правила нет, то, как указано выше, возможна согласованность. Вы можете рассмотреть доменные события для этой цели. см. пост Уди Даана