DDD,你如何改变一个ValueObject?

DDD, how do you change a ValueObject?

问题是指您必须 update/delete 一个值对象的情况。

考虑这种情况。

您有订单和产品,产品有产品项目。其中 ProductItem 是一个 ValueObject。如果您必须更新 Product 中的 productItems 列表(比方说更新数量),您会怎么做?您将如何确定需要更新的确切 ProductItem?

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

您可以通过任何需要的方式在列表中识别 Value object,对此没有 规则

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

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

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)
}