Обновить объект внутри агрегата

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

Допустим, у меня есть Пользователь с кучей адресов es. Пользователь является совокупным корнем, в то время как Address существует только в совокупности.

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

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

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

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

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

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

    address = user.getAddress (id);
    address.setPostCode ("12345");
    address.setCity ("Нью-Йорк");
    em.persist (пользователь) ;

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

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

    user.updateAddress (id, "12345" , "Нью-Йорк");
    em.persist (user);

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

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

    user.removeAddress ( id);
    address = new Address ();
    address.setPostCode ("12345");
    address.setCity ("Нью-Йорк");
    user.addAddress (адрес);
    em.persist (user);

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

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

8
задан Community 23 May 2017 в 12:26
поделиться