假设在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中,订单的实例化在用户实体内部得到了处理。
答案 0 :(得分:3)
你肯定应该使用构造函数来创建对象,而不是setter。 DDD的一个重要原则是传达意图。如果为了创建用户需要name,那么只要允许在提供名称的情况下创建User实例,就可以清楚地传达该要求。这些被称为“不变量”,在创建对象之前应始终满足。这样你就可以清楚地说“在这个对象处于有效状态之前,你需要提供这个。”
重构对象时(例如在存储库中),您需要将子对象传递给构造函数。根据我的经验,我的聚合有两个构造函数:一个用于创建(可能由工厂调用),另一个用于重构(通常由存储库调用)。