Правильное восстановление агрегатных объектов в хранилище? - PullRequest
1 голос
/ 07 июня 2010

Если предположить, что ORM (например, Doctrine) не используется внутри репозитория, мой вопрос заключается в том, как правильно создать экземпляры объектов Aggregate? Является ли он созданием дочерних объектов непосредственно внутри репозитория и просто назначает его совокупному корню через его установщики, или совокупный корень отвечает за создание своих дочерних объектов / объектов?

Пример 1:

class UserRepository
{
  // Create user domain entity.
  $user = new User();
  $user->setName('Juan');

  // Create child object orders entity.
  $orders = new Orders($orders);
  $user->setOrders($orders);
}

Пример 2:

class UserRepository
{
  // Create user domain entity.
  $user = new User();
  $user->setName('Juan');

  // Get orders.
  $orders = $ordersDao->findByUser(1);
  $user->setOrders($orders);
}

, тогда как в примере 2 создание заказов выполняется внутри сущности пользователя.

1 Ответ

3 голосов
/ 11 июля 2011

Вы определенно должны использовать конструктор для создания объектов, а не сеттеров. Одним из важных принципов DDD является передача намерений. Если для создания пользователя требуется имя, то вы четко сообщаете об этом требовании, разрешая создание экземпляра пользователя только при условии указания имени. Они называются «инвариантами» и должны всегда выполняться перед созданием объекта. Таким образом, вы четко говорите: «Это то, что вам нужно предоставить, прежде чем этот объект будет в действительном состоянии».

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

...