在域驱动设计中,我们鼓励建立在域中表达真实概念的丰富实体。
假设我们有一个实体Vehicle
,它按身份引用聚合根Person
- Vehicle
归Person
所有。
但是,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;
//...
}
}
我更倾向于使用第二种方法,但是真的可以像这样模拟聚合根吗?
聚合根究竟是什么; Vehicle
或OwnedVehicle
?
我们现在有两个单独的存储库,还是存储库会返回基类型Vehicle
?这意味着我们需要施展 - 不理想。
答案 0 :(得分:1)
据我了解,AggregateRoot的松散定义不是子实体,而子实体只能在引用另一个父实体时被理解。例如,OrderLine仅在订单方面有意义。
一个人和一辆车不是这个 - 你可以拥有一个没有汽车的人,以及一个没有人的汽车。
对于这样的情况,您有一个管理聚合根之间关系的服务。
https://lostechies.com/jimmybogard/2008/08/21/services-in-domain-driven-design/
该操作涉及的域概念不是实体或值对象的自然部分
接口是根据域模型中的其他元素定义的
该操作是无状态的
因此,在这种情况下,您可能拥有CarOwnersipService,它可以更新汽车和人员以实现所有权,但外部世界不知道谁的详细信息。服务在这里是有意义的,因为根据应用程序,规则可能不同。例如,您可以查看谁在移动设备上拥有汽车,但只在另一个应用程序中分配所有权?
让我暂停的原因是操作是无状态的 - 如果我们认为幂等服务是无状态的,它确实满足定义,但否则它不会。