继承与聚合根源

时间:2015-06-01 14:53:19

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

在域驱动设计中,我们鼓励建立在域中表达真实概念的丰富实体。

假设我们有一个实体Vehicle,它按身份引用聚合根Person - VehiclePerson所有。

但是,Vehicle可以在没有所有者的情况下存在,例如在制造之后。

你会如何建模?

一种方法可能是Nullable类型:

public class Vehicle : DomainEntity<Guid>
{
    public Guid? Owner { get; private set; }

    public Vehicle(...)
        : base(Guid.NewGuid())
    {
        //...
    }

    public Vehicle(Guid owner, ...)
        : base(Guid.NewGuid())
    {
        Owner = owner;
        //...
    }
}

另一种方法是使用多个类和继承:

public class Vehicle : DomainEntity<Guid>
{
    public Vehicle(...)
        : base(Guid.NewGuid())
    {
        //...
    }
}

public class OwnedVehicle : Vehicle 
{
    public Guid Owner { get; private set; }

    public OwnedVehicle(Guid owner, ...)
        : base(Guid.NewGuid())
    {
        Owner = owner;
        //...
    }
}

我更倾向于使用第二种方法,但是真的可以像这样模拟聚合根吗?

聚合根究竟是什么; VehicleOwnedVehicle

我们现在有两个单独的存储库,还是存储库会返回基类型Vehicle?这意味着我们需要施展 - 不理想。

1 个答案:

答案 0 :(得分:1)

据我了解,AggregateRoot的松散定义不是子实体,而子实体只能在引用另一个父实体时被理解。例如,OrderLine仅在订单方面有意义。

一个人和一辆车不是这个 - 你可以拥有一个没有汽车的人,以及一个没有人的汽车。

对于这样的情况,您有一个管理聚合根之间关系的服务。

https://lostechies.com/jimmybogard/2008/08/21/services-in-domain-driven-design/

  

该操作涉及的域概念不是实体或值对象的自然部分

     

接口是根据域模型中的其他元素定义的

     

该操作是无状态的

因此,在这种情况下,您可能拥有CarOwnersipService,它可以更新汽车和人员以实现所有权,但外部世界不知道谁的详细信息。服务在这里是有意义的,因为根据应用程序,规则可能不同。例如,您可以查看谁在移动设备上拥有汽车,但只在另一个应用程序中分配所有权?

让我暂停的原因是操作是无状态的 - 如果我们认为幂等服务是无状态的,它确实满足定义,但否则它不会。