【问题标题】:DDD aggregate roots design for a relation that have internal types具有内部类型的关系的 DDD 聚合根设计
【发布时间】:2015-05-03 09:50:35
【问题描述】:

假设我有一个名为 User 的聚合根,用户可以有多个 VehicleVehicle 实体具有诸如 (suvtrucksedan 等类型... )。

在这种情况下,如果我想获得sedan 类型的User 车辆,我是否必须设计我的聚合以直接从聚合中获取sedans,如User->getSedans()

或者我可以得到 UserRepository->getVehiclesOfTypeSedan() 并且聚合只包含 Vehicles 吗?

【问题讨论】:

  • 您要问的第一个问题是为什么您的User 聚合有车辆集合。您试图对大型 User 集群强制执行哪些不变量?您可能会说唯一性,但我们通常可以将该约束留给数据库,因此它不是证明持有集合的不变量。您应该强烈考虑在Vehicule 上使用owner,它只引用Userid。然后,获得车辆看起来像vehiculeRepository.ofOwnerAndType(ownerId, VehiculeType.Sedan)
  • 另外,根据您的域,您可能需要重新考虑将聚合根命名为 User。大多数域中通常都有更合适的名称(例如Client)。

标签: php domain-driven-design aggregate ddd-repositories aggregateroot


【解决方案1】:

为了让你的接口和继承齐头并进,我认为最好把你的逻辑分开:

UserRepository->getVehicles("sedan");

或者你可以使用方法链:

UserRepository->getVehicles()->sedan;

在上面的代码中,getVehicles() 返回一个集合对象,该对象具有NOT 一个名为sedan 的属性。 您必须使用 php __get() 进行操作。 那我为什么要这样做?因为如果您能够通过属性按类型获取汽车(请记住属性不是函数,没有执行),那么它的字面意思是您已经获取了所有类型并准备好它们:

错误的方式和内存杀手方法是您获取用户的所有汽车并将每种类型的汽车放入其关联的属性中。

更好的方法是返回一个对象,然后该对象附带一个函数__get(),以便在每次属性检索时调用:

$object->轿车;

sedan不存在,所以你已经预测到了:

function __get($param)
{
   $this->__getByType($param);
}

虽然我更喜欢我的第一个建议。

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多