Я новичок в 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);
}
}