项目

值对象

一个代表领域描述性方面且没有概念标识的对象被称为值对象。

(埃里克·埃文斯)

两个具有相同属性但不同 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实体更简洁。

另请参阅

在本文档中