假设我有一个关系,每个客户都有一个地址(在这种情况下,是一个实体),如下所示:
客户{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现在都与相同的记录具有相同的绑定,这很危险。
答案 0 :(得分:2)
您的样品都不是DDD。每一个都是简单的CRUD。
customer.MoveTo(new Address(...))
customer.FixAddressTypo(new Address(...))
存储库用于聚合,而不是任何实体。确定您的聚合。 http://dddcommunity.org/library/vernon_2011/
为什么不将Addres值Object映射为Cutomers表中的一堆字段?您不需要单独的表只是因为您有一个单独的类。
值对象应该是不可变的。