【发布时间】:2020-06-08 05:04:47
【问题描述】:
假设我们销售汽车,定制汽车。
客户选择CarModel,然后开始配置CarModel。在我们店里,她只能选择Steeringwheel的颜色。
一些 CarModel 的 SteeringWheels 类型可能比其他车型多。
因此,我们有一个Catalog,其中包含CarModels 和SteeringWheels。
客户可以创建CarConfiguration。她选择模型,然后从该模型的可用方向盘中选择她喜欢的颜色方向盘。
class Catalog
{
public IReadonlyCollection<int> CarModels { get; }
public IReadonlyCollection<int> SteeringWheels { get; }
public void RemoveSteeringWheel(int steeringWheelId)
{
...
}
}
class SteeringWheel : AggregateRoot
{
public int Id { get; }
public string Color { get; }
public decimal Price { get; set; }
}
class CarModel : AggregateRoot
{
public int Id { get; }
public decimal Price { get; set; }
public IReadonlyCollection<int> SteeringWheels { get; }
public void AddSteeringWheel(int steeringWheelId)
{
...
}
public CarOrder CreateCarOrder(int steeringWheelId)
{
return new CarOrder(...);
}
}
class CarOrder : AggregateRoot
{
public int Id { get; set; }
public CarConfiguration CarConfiguration { get; set; }
}
class CarConfiguration : ValueObject
{
public int CarModelId { get; set; }
public int SteeringWheelId { get; set; }
}
为此,有一个不变量,即一个车型的可用方向盘必须始终存在于目录中。为了强制执行这个不变量,我们必须保护(至少)两种方法:
-
AddSteeringWheelCarModel;如果Catalog中可用,我们只能添加SteeringWheel -
RemoveSteeringWheel上Catalog;如果SteeringWheel没有在任何CarModel上配置,我们只能删除它。
如何强制执行这个不变量? CarModel 不知道 Catalog 上的 SteeringWheel 系列,Catalog 也不知道 CarModel 的方向盘。
我们可以引入域服务并将存储库注入其中。该服务将能够访问来自两个聚合的数据并能够强制执行不变量。
其他选项是创建导航属性并配置 ORM(在我的例子中为实体框架核心)以显式加载这些关系。
可能还有更多,我现在想不出……
实现这一目标的最优雅/纯ddd/最佳实践选项是什么?
【问题讨论】: