【问题标题】:Proper reconstitution of Aggregate objects in the Repository?正确重构存储库中的聚合对象?
【发布时间】:2010-06-07 03:15:48
【问题描述】:

假设存储库中没有使用 ORM(例如 Doctrine),我的问题是实例化聚合对象的正确方法是什么?它是直接在 Repository 中实例化子对象,并通过其设置器将其分配给 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 中,订单的实例化是在用户实体内部进行的。

【问题讨论】:

  • 我不太确定(不完全理解这个问题),但最后的评论说“在用户实体内部处理订单” - 我认为你 don' t 想要这样做。实体不想自作主张。如果您必须从实体内部委派此类责任,则应将其代理给域服务。

标签: repository domain-driven-design aggregate


【解决方案1】:

您绝对应该使用构造函数来创建对象,而不是 setter。 DDD 的重要原则之一是传达意图。如果创建用户需要名称,那么您只需在提供名称的情况下才允许创建用户实例,从而清楚地传达该要求。这些被称为“不变量”,并且应该在创建对象之前始终满足。这样您就清楚地表明“这是您在此对象处于有效状态之前需要提供的内容。”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 2012-08-04
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多