实现将业务逻辑排序/过滤到DDD聚合中

时间:2012-11-06 15:54:24

标签: php domain-driven-design aggregate aggregateroot aggregates

我是DDD的新手,对我而言,我实际上搜索了聚合的良好功能。我有很长的用户列表(User),并为此创建了一个聚合(UserAggregate)。

现在在我看来,我可能会根据不同的标准显示用户。我们假设我在这里不对数据库查询中的列表进行排序,可以在聚合中进行排序吗?我无法提出应用程序的另一部分,我可以正确地做到这一点,但我可能会误解聚合的功能。

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

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

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

顺便过滤同样适用。当我读到有关DD​​D聚合的内容时,我立即想到了Doctrine\Common\Collections\Collectionlink)。那种看起来像是我的聚合。那么DDD专家,请赐教: - )

更新

我认为btw的唯一方法是使聚合变得相当不变,并有助手来创建新的聚合。但这似乎不是要走的路:

$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);
  }
}

1 个答案:

答案 0 :(得分:-1)

根聚合不是存储库。根聚合表示单个用户及其所有特定于域的信息。

应该在存储库中应用排序和过滤。