值对象
一个代表领域描述性方面且没有概念标识的对象被称为值对象。
(埃里克·埃文斯)
两个具有相同属性但不同 Id 的 实体 被视为不同的实体。然而,值对象没有Id,如果它们具有相同的属性值,则被视为相等。
ValueObject类
ValueObject是一个抽象类,可以通过继承来创建值对象类。
示例:一个地址类
public class Address : ValueObject
{
public Guid CityId { get; private set; }
public string Street { get; private set; }
public int Number { get; private set; }
private Address()
{
}
public Address(
Guid cityId,
string street,
int number)
{
CityId = cityId;
Street = street;
Number = number;
}
protected override IEnumerable<object> GetAtomicValues()
{
yield return Street;
yield return CityId;
yield return Number;
}
}
- 值对象类必须实现
GetAtomicValues()方法以返回原始值。
ValueEquals
ValueObject.ValueEquals(...)方法用于检查两个值对象是否相等。
示例:检查两个地址是否相等
Address address1 = ...
Address address2 = ...
if (address1.ValueEquals(address2)) //检查相等性
{
...
}
最佳实践
以下是使用值对象时的一些最佳实践:
- 如果没有充分的理由将其设计为可变,则将值对象设计为不可变(如上面的地址示例)。
- 构成值对象的属性应形成一个概念整体。例如,CityId、Street和Number不应作为Person实体的单独属性。这也使得Person实体更简洁。
抠丁客


