Я читал аналогичный вопрос по SO: Как обновить объект внутри Aggregate, но я все еще не уверен, как пользовательский интерфейс должен взаимодействовать с сущностями внутри агрегата.
Допустим, у меня есть User
с кучей Address
es. Пользователь - это совокупный корень, в то время как Адрес существует только внутри совокупности.
В веб-интерфейсе пользователь может редактировать свои адреса. В основном происходит следующее:
- Пользователь видит список адресов в своем веб-интерфейсе.
- Он нажимает на адрес, и его перенаправляют на эту страницу:
edit-address?user=1&address=2
- На этой странице он получает форму, в которой он может изменить этот адрес.
Я решил обойти совокупный корень, это было бы просто:
- Мы бы напрямую загрузили
Address
с егоId
- Мы обновим его, а затем сохраним
Поскольку мы хотим сделать это способом DDD, у нас есть разные решения:
Либо мы просим пользователя получить этот адрес по идентификатору:
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
Проблема с этим подходом, ИМО, заключается в том, что совокупный корень по-прежнему не имеет большего контроля над тем, что делается с адресом. Он просто возвращает ссылку на него, так что это не сильно отличается от обхода агрегата.
Или мы говорим агрегату обновить существующий адрес:
user.updateAddress(id, "12345", "New York");
em.persist(user);
Теперь агрегат контролирует, что делается с этим адресом, и может предпринимать любые необходимые действия, связанные с обновлением адреса.
Или мы рассматриваем Address как объект значения и не обновляем наш
Address
, а скорее удаляем его и воссоздаем:user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
Последнее решение выглядит элегантно, но означает, что адрес не может быть сущностью. Тогда что, если его нужно рассматривать как сущность, например, потому что другой бизнес-объект в агрегате имеет ссылку на него?
Я почти уверен, что мне здесь не хватает чего-то, чтобы правильно понять агрегатную концепцию и то, как она используется в реальных примерах, поэтому, пожалуйста, не стесняйтесь оставлять свои комментарии!