Domain driven design 更新聚合根中的多态子实体

Domain driven design 更新聚合根中的多态子实体,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,我试图找出更新聚合根中多态子实体的最佳方法。作为参考,假设我有一个ShippingContainer根实体,它存储Cargo对象;有许多类型的货物对象,例如,大货物,危险货物,等等,每种都有其独特的属性 我在读这个问题: 这个问题的答案似乎表明,我应该将ChangeCargo方法放在ShippingContainer对象上,使用某种类型的DTO参数对象。我的问题是,当您尝试更新的对象是多态对象时,这是否仍然是最佳实践(我现在是否需要一个DTO对象层次结构来镜像货物对象类型?),或者我是否应该做其

我试图找出更新聚合根中多态子实体的最佳方法。作为参考,假设我有一个
ShippingContainer
根实体,它存储
Cargo
对象;有许多类型的
货物
对象,例如,
大货物
危险货物
,等等,每种都有其独特的属性

我在读这个问题:


这个问题的答案似乎表明,我应该将
ChangeCargo
方法放在
ShippingContainer
对象上,使用某种类型的DTO参数对象。我的问题是,当您尝试更新的对象是多态对象时,这是否仍然是最佳实践(我现在是否需要一个DTO对象层次结构来镜像货物对象类型?),或者我是否应该做其他事情?

如果ChangeCargo用例知道它希望更改的货物的特定类型,然后,对于每种货物类型,可能会有这种方法的特定版本

但是,如果更改本身与货物类型无关,那么最好利用多态性并将更新委托给每个货物子类型。这种变化可以用DTO、value对象或几个参数来表示

例如(C#):

class装运集装箱
{
列出货物清单;
public void changeChargo(字符串cargoId,DateTime expectedArrival,…)
{
var cargo=this.cargos.FirstOrDefault(cargo=>cargo.Id==cargoId);
货物。变更(预计到达,…);
}
}
货物类别:货物
{
公共无效更改(DateTime expectedArrival,…{}
}
危险货物类别:货物
{
公共无效更改(DateTime expectedArrival,…{}
}

expectedArrival
开头的参数可以是DTO或最能代表变化的任何参数。

假设每种货物都需要唯一的数据,您认为我是否应该使用代表每种变化的DTO层次结构(如我在原始问题中所建议的那样?)如果存在唯一的数据,这意味着变更用例知道其希望变更的特定货物类型。因此,您可能会有一组不同的DTO或一组不同的更改方法,但DTO不需要形成层次结构,但如果恢复某些内容有好处,它们可以。如果我有一组独特的DTO,我如何有效地委托更改操作(因为聚合方法需要采用更通用的DTO?)一种方法是让ShippingContainer将货物铸造到适当的类型,并将DTO传递给货物子类型上的方法。另一种方法是拥有DTO层次结构,并在ShippingContainer将DTO传递给每个Cargo子类型后将DTO转换为所需类型。我确实感觉ShippingContainer(SC)实际上不是聚合根,而是货物集合(即伪装的存储库)的简单持有者或货物分组的标准。问问自己,SC是否可以在没有任何货物的情况下运行,它是否有货物列表或外观之外的任何行为。