Я добавил пример кода для наиболее распространенного сценария. Я не буду беспокоиться о количестве полей - DDD на самом деле не о данных, а об отношениях и сложности управления.

ал аналогичный вопрос на SO:Как обновить сущность внутри агрегата, но я все еще не уверен, как пользовательский интерфейс должен взаимодействовать с объектами внутри агрегата.

Допустим, у меня естьUserс кучейAddressэс. Пользователь - это корень агрегата, а Адрес существует только внутри агрегата.

На веб-интерфейсе пользователь может редактировать свои адреса. По сути, происходит следующее:

Пользователь видит список адресов в своем веб-интерфейсе.Он нажимает на адрес и перенаправляется на эту страницу:edit-address?user=1&address=2На этой странице он получает форму, где он может изменить этот адрес.

Я решил обойти совокупный корень, это было бы просто:

Мы бы напрямую загрузилиAddress с этимиIdМы бы обновили его, а затем сохранили

Поскольку мы хотим сделать это DDD, у нас есть разные решения:

Либо мыпопросить пользователя получить этот адрес по идентификатору:

address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);

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

Или мысообщить агрегату обновить существующий адрес:

user.updateAddress(id, "12345", "New York");
em.persist(user);

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

Или мы рассматриваем адрес какобъект стоимостии мы не обновляем нашиAddress, скорееудалить его и воссоздать:

user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);

Это последнее решение выглядит элегантно, но означает, что Адрес не может быть сущностью. Тогда что, если это должно бытьрассматривается как сущностьНапример, потому что другой бизнес-объект в агрегате имеет ссылку на него?

Я почти уверен, что мне чего-то не хватает, чтобы правильно понять концепцию совокупности и то, как она используется в реальных примерах, поэтому, пожалуйста, не стесняйтесь оставлять свои комментарии!

Ответы на вопрос(1)

Ваш ответ на вопрос