DDD,您如何更改ValueObject?

时间:2018-11-20 10:43:26

标签: architecture domain-driven-design software-design value-objects

问题是指必须更新/删除值对象的情况。

考虑这种情况。

您有一个订单,您有一个产品,并且产品有一个ProductItems。其中ProductItem是ValueObject。如果您必须更新“产品”中的productItems列表(例如更新数量),您将如何做?您将如何确定需要更新的确切ProductItem?

这是从透视图或OrderingContext的角度来看,应该有一个支持的上下文,其中您具有ProductItem库存和ProductItem的定价(InventoryContext),一个ProductItem不仅是ValueObject的上下文,但是由于我们在OrderingContext下,如何如果您无法识别ProductItem,会更新它吗?

2 个答案:

答案 0 :(得分:2)

您可以通过任何所需的方式在列表中标识Value object,但没有规则

例如,在这种情况下,一种识别它的方法是使用列表中的数字索引。如果您需要更稳定的东西(即在重新排序商品时也能使用),则可以使用GUID来支持GUID而不是数字索引。例如,PHP允许您使用strings进行数组访问,GUIDs可以在用于数组查找之前转换为strings

要记住的关于Value objects的重要规则:它们应该是不可变的,也就是说,如果您需要更新一个,则可以将其替换为另一个实例。

答案 1 :(得分:0)

ValueObject背后的想法是它是不可变的。当您要更改值对象时,无需逐个属性地更改该对象,而是更改整个对象。

public class MyVo
{
   public int MyProp1 { get; }
   public int MyProp2 { get; }
   public int MyProp3 { get; }

   private MyVo()
   {
   }
   public MyVo(int myProp1)
   {
      MyProp1 = myProp1
   }
   private MyVo(int myProp1, int myProp2, int myProp3)
     :this(myProp1)
   {
      MyProp2 = myProp2
      MyProp3 = myProp3
   }

   public MyVo MyMeaningfulNameMethod(int prop2, int prop3)
      => new MyVo(this.MyProp1, prop2, prop3)
}