我试图弄清楚在聚合根中更新多态子实体的最佳方法是什么。作为参考,假设我有一个存储ShippingContainer
个对象的Cargo
根实体;有许多类型的Cargo
个对象,例如BigCargo
,HazardousCargo
等,每个对象都有自己独特的属性。
我正在阅读这个问题:Update an entity inside an aggregate
这个问题的答案似乎表明我应该将ChangeCargo
方法放在ShippingContainer
对象上,采用某种DTO参数对象。我的问题是,当您尝试更新的对象是多态的时,这仍然是最佳实践(我现在需要镜像Cargo对象类型的DTO对象层次结构吗?),还是应该做其他事情?
答案 0 :(得分:2)
如果ChangeCargo用例知道它希望更改的特定货物类型,那么每种货物类型可能会有特定版本的此方法。
但是,如果变更本身与货物类型无关,那么最好利用多态性并将更新委托给每个货物子类型。可以使用DTO,值对象或一些参数表示更改。
例如(C#):
class ShippingContainer
{
List<Cargo> cargos;
public void ChangeCargo(string cargoId, DateTime expectedArrival, ...)
{
var cargo = this.cargos.FirstOrDefault(cargo => cargo.Id == cargoId);
cargo.Change(expectedArrival, ...);
}
}
class BigCargo : Cargo
{
public void Change(DateTime expectedArrival, ...) { }
}
class HazardousCargo : Cargo
{
public void Change(DateTime expectedArrival, ...) { }
}
以expectedArrival
开头的参数可以是DTO,也可以是最能代表变化的参数。