gpt4 book ai didi

domain-driven-design - DDD 中的值对象 - 为什么是不可变的?

转载 作者:行者123 更新时间:2023-12-03 08:32:50 40 4
gpt4 key购买 nike

我不明白为什么 DDD 中的值对象应该是不可变的,我也看不出这是如何轻松完成的。 (我专注于 C# 和 Entity Framework ,如果这很重要的话。)

例如,让我们考虑经典的 Address 值对象。如果您需要将“123 Main St”更改为“123 Main Street ”,为什么我需要构建一个全新的对象而不是 myCustomer.Address.AddressLine1 = “123 Main Street”? (即使 Entity Framework 支持结构,这仍然是个问题,不是吗?)

我理解(我认为)值对象没有身份并且是域对象的一部分的想法,但是有人可以解释为什么不变性是一件好事吗?

编辑 :我的最后一个问题真的应该是“有人可以解释为什么不变性是一件好事 应用于值对象?”对困惑感到抱歉!

编辑 :为了澄清,我不是在询问 CLR 值类型(与引用类型相比)。我在问值对象的更高级别的 DDD 概念。

例如,这是一种为 Entity Framework 实现不可变值类型的 hack-ish 方法:http://rogeralsing.com/2009/05/21/entity-framework-4-immutable-value-objects .基本上,他只是将所有二传手设为私有(private)。为什么要这样做呢?

最佳答案

我参加聚会很晚了,但我自己一直在想这个。 (将不胜感激任何评论。)

我认为这里没有明确引用它,但我认为 Evans 对不变性的引用主要是在共享的背景下:

in order for an object to be shared safely, it must be immutable: it cannot be changed except by full replacement. (Evans p100)



Evan 的书中还有一个侧边栏,名为“地址是值对象吗?谁在问?”。

If roommates each called to order electrical service [ie if two customers had the same address], the company would need to realize it. [So] Address is an Entity. (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);
}

就总体优势而言,一些在 In DDD, what are the actual advantages of value objects? .值得注意的是,您只需在创建时验证 VO。如果你这样做,那么你知道它总是有效的。

关于domain-driven-design - DDD 中的值对象 - 为什么是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581579/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com