正确重建存储库中的Aggregate对象?

时间:2010-06-07 03:15:48

标签: repository domain-driven-design aggregate

假设在Repository中没有使用ORM(例如Doctrine),我的问题是实例化Aggregate对象的正确方法是什么?它是直接在Repository中实例化子对象,只是通过其setter将它分配给Aggregate Root,还是Aggregate Root负责构造它的子实体/对象?

示例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 个答案:

答案 0 :(得分:3)

你肯定应该使用构造函数来创建对象,而不是setter。 DDD的一个重要原则是传达意图。如果为了创建用户需要name,那么只要允许在提供名称的情况下创建User实例,就可以清楚地传达该要求。这些被称为“不变量”,在创建对象之前应始终满足。这样你就可以清楚地说“在这个对象处于有效状态之前,你需要提供这个。”

重构对象时(例如在存储库中),您需要将子对象传递给构造函数。根据我的经验,我的聚合有两个构造函数:一个用于创建(可能由工厂调用),另一个用于重构(通常由存储库调用)。