我来晚了,但我一直在思考这个问题。(欢迎任何评论。)
我认为Evans提到不变性的引用主要是在共享的上下文中:
为了安全地共享对象,它必须是不可变的:它只能通过完全替换来改变。(Evans p100)
在Evan的书中还有一个名为“地址是否是值对象?谁在问?” 的侧边栏。
如果室友都打电话订购电力服务[即两个客户具有相同的地址],公司将需要意识到这一点。因此,地址是一个实体。(Evans p98)
在您提供的示例中,假设客户的家庭地址和工作地址都是123 Main Street。当您进行所描述的更正时,两个地址都会更改吗?如果是这样,并且如果我正确理解Evans,那么听起来您真的拥有一个实体。
以另一个例子为例,假设我们有一个对象来表示客户的全名:
public class FullName
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Customer
{
public FullName Name { get; set; }
}
没有值对象,以下操作将失败:
[Test]
public void SomeTest() {
var fullname = new FullName { FirstName = "Alice", LastName = "Jones" };
var customer1 = new Customer { Name = fullname };
var customer2 = new Customer { Name = fullname };
// Customer 1 gets married.
customer1.Name.LastName = "Smith";
// Presumably Customer 2 shouldn't get their name changed.
// However the following will fail.
Assert.AreEqual("Jones", customer2.Name.LastName);
}
就一般而言,在DDD中,值对象有哪些实际优势被认为是其中之一。值得注意的是,您只需要在创建VO时验证一次。如果这样做,那么您就知道它始终是有效的。