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