值对象

介绍

“ 表示没有概念身份的域的描述性方面的对象称为值对象。 ”(Eric Evans)。

实体具有标识(Id),而值对象则没有。如果两个实体的身份不同,即使这些实体的所有属性相同,它们也被视为不同的对象/实体。想象一下两个不同的人,他们有相同的姓名,姓氏和年龄,但他们是不同的人(他们的身份号码不同)。对于Address类(这是一个经典的Value Object),如果这两个地址具有相同的Country,City和Street编号等,则它们被认为是相同的地址。

在域驱动设计(DDD)中,值对象是另一种域对象,它可以包含业务逻辑,是域的重要组成部分。

值对象基类

ABP有一个ValueObject <T>基类,可以继承它以便轻松创建Value Object类型。这是一个示例地址值对象类型:

public class Address : ValueObject<Address>
{
    public Guid CityId { get; private set; } //A reference to a City entity.

    public string Street { get; private set; }

    public int Number { get; private set; }

    public Address(Guid cityId, string street, int number)
    {
        CityId = cityId;
        Street = street;
        Number = number;
    }
}

ValueObject基类重写等于运算符(以及其他相关的运算符和方法)以比较两个值对象,并假设它们在所有属性相同时都是相同的。例如,所有这些测试都通过:

var address1 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42);
var address2 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42);

Assert.Equal(address1, address2);
Assert.Equal(address1.GetHashCode(), address2.GetHashCode());
Assert.True(address1 == address2);
Assert.False(address1 != address2);

即使它们在内存中是不同的对象,它们对于我们的域也是相同的。

最佳实践

以下是使用Value Objects时的一些最佳实践:

nidie.com.cn - 用心与你沟通