这是如何为DDD构建类的?

时间:2014-02-06 03:59:24

标签: domain-driven-design repository-pattern

假设我有一个关系,每个客户都有一个地址(在这种情况下,是一个实体),如下所示:

客户{Id,Name,MyAddress(地址实例)}

我是否应该允许公开以下选项的结构:

MyCustomer.MyAddress.Street = "Pine Street";
CustomerRepository.Save(MyCustomer);

对于Customer类和Address类,它是否应该级联保存?或者,执行以下操作是否更好:

MyCustomer.MyAddress.Street = "Pine Street";
AddressRepository.Save(MyCustomer.MyAddress);

不幸的是,Address确实是一个值对象,但我不能像DDD那样使它可以互换,因为Id标签存在;例如,如果我执行以下操作:

Customer1.setAddress(Customer2.getAddress());

Customer1和Customer2现在都与相同的记录具有相同的绑定,这很危险。

1 个答案:

答案 0 :(得分:2)

您的样品都不是DDD。每一个都是简单的CRUD。

  1. 不要“设置字段”。做有意义的操作。
  2. customer.MoveTo(new Address(...))
    customer.FixAddressTypo(new Address(...))
    
    1. 存储库用于聚合,而不是任何实体。确定您的聚合。 http://dddcommunity.org/library/vernon_2011/

    2. 为什么不将Addres值Object映射为Cutomers表中的一堆字段?您不需要单独的表只是因为您有一个单独的类。

    3. 值对象应该是不可变的。