2

我试图弄清楚在聚合根中更新多态子实体的最佳方法是什么。作为参考,假设我有一个存储对象的ShippingContainer根实体;Cargo有许多类型的Cargo对象,例如 、BigCargoHazardousCargo,每一种都有自己独特的属性。

我正在阅读这个问题:更新聚合中的实体

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

4

1 回答 1

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 或任何最能代表更改的参数。

于 2013-01-25T18:35:42.833 回答