Architecture DDD,如何更改ValueObject?

Architecture DDD,如何更改ValueObject?,architecture,domain-driven-design,software-design,value-objects,Architecture,Domain Driven Design,Software Design,Value Objects,该问题指的是必须更新/删除valueobject的情况 考虑一下这种情况 你有订单,有产品,产品有产品项。其中ProductItem是一个ValueObject。如果您必须更新Product中productItems的列表(比如更新数量),您将如何做?您将如何确定需要更新的确切ProductItem 这是从OrderingContext的角度来看的,应该有一个支持上下文,其中有ProductItem库存和ProductItem定价(InventoryContext),其中ProductItem不

该问题指的是必须更新/删除valueobject的情况

考虑一下这种情况

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


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

您可以通过您需要的任何方式来识别列表中的
值对象,没有相关规则

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


关于
值对象
,需要记住的重要规则是:它们应该是不可变的,也就是说,如果需要更新一个对象,那么就用另一个实例替换它

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

什么是ProductItem?价值对象的本质是通过其价值(D'oh)来识别的。如果您有一个
Money
value对象,那么它由“Amount”(即十进制值)和“Currency”(另一种值类型或字符串)标识@Tseng:ProductItem是具有名称和数量的对象。假设你想更新数量,你会怎么做?我猜您可以通过它的ProductId和名称来识别它?
product.ProductItem=newproductItem(5,“一些描述”)
;)这就是它的本质。在集合上,首先需要删除它,然后向其中添加新的值类型。一般来说,你似乎对DDD的理解不好。订单和产品真的是一个不同的有界环境吗?如果是,则不会从另一个上下文中更改其中一个。有界上下文从不直接作用于其他BC的聚合。您必须始终使用某种类型的反腐败层来将其传输到消息,然后再将其传输回其他有界上下文,以了解如何识别它?您搜索一个ProductItem,该ProductItem作为数量
5
Some Description
作为描述。这就是通过属性的总和来识别值对象的方式,不同于通过唯一id识别的实体