更新聚合根目录中的多态子实体

时间:2013-01-25 17:16:08

标签: domain-driven-design aggregateroot

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

我正在阅读这个问题:Update an entity inside an aggregate

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

1 个答案:

答案 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,也可以是最能代表变化的参数。