Внедрить бизнес-логику сортировки / фильтрации в агрегаты DDD.

Я новичок в DDD, и на практике я ищу хорошую функцию для агрегата. У меня есть длинный список пользователей (User) и я создаю для этого агрегат (UserAggregate).

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

$users = new UserAggregate(array(
 $user1, $user2, $user3, $user4
));

foreach ($users->sortBySurname(), $user) {
 //
}

foreach ($users->sortByLastLoggedIn(), $user) {
 //
}

Кстати, то же самое и с фильтрацией. Когда я прочитал об агрегатах DDD, я сразу подумал о Doctrine\Common\Collections\Collection (ссылка). Для меня это похоже на совокупность. Итак, эксперты DDD, просветите меня, пожалуйста :-)

Обновить

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

$aggregate = new UserAggregate(array($user1, $user2));
$helper    = new FilterSomething;
$aggregate = $helper->filter($aggregate);

Второй агрегат - это новый экземпляр, поэтому помощник выглядит так:

class FilterSomething
{
  public function filter(Aggregate $aggregate)
  {
    $items = $aggregate->getItems();
    $items = $this->doFilter($items);

    return new Aggregate($items);
  }
}

person Jurian Sluiman    schedule 06.11.2012    source источник


Ответы (1)


Корневой агрегат - это не репозиторий. Корневой агрегат представляет одного пользователя и всю информацию, относящуюся к его домену.

Эту сортировку и фильтрацию следует применять в репозитории.

person jgauffin    schedule 07.11.2012