【问题标题】:Inheritance and Aggregate Roots继承和聚合根
【发布时间】:2015-06-01 14:53:19
【问题描述】:

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

假设我们有一个实体 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?这意味着我们需要强制转换 - 不理想。

【问题讨论】:

  • 如果VehiclePerson 拥有,那么Person 会拥有零个或多个对Vehicles 的引用吗?您给出的示例受到使用关系数据库所施加的约束的约束。 IE。它受到持久性问题的技术性限制。
  • 听起来您正在处理多个有界上下文:例如制造和销售

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


【解决方案1】:

据我了解,AggregateRoot 的松散定义不是子实体,子实体是只能参考另一个父实体才能理解的东西。例如,OrderLine 仅对 Order 有意义。

Person 和 Car 不是这样 - 在您的示例中,您可以有一个没有 Car 的 Person 和一个没有 Person 的 Car。

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

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

操作与不是实体或值对象的自然部分的域概念相关

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

操作是无状态的

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

让我停下来的是无状态操作——如果我们认为幂等服务是无状态的,它确实满足定义,否则不满足。

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 2014-08-09
    • 1970-01-01
    • 2015-08-21
    • 2014-05-07
    • 2012-01-31
    • 2012-01-06
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多