diff --git a/docs/zh-Hans/Value-Objects.md b/docs/zh-Hans/Value-Objects.md index 6735074fd4..c5dd929ff2 100644 --- a/docs/zh-Hans/Value-Objects.md +++ b/docs/zh-Hans/Value-Objects.md @@ -1,3 +1,75 @@ -## Value Objects +## 值对象 - TODO \ No newline at end of file +> 一个对象,表示领域的描述方面,没有概念上的身份被称为 值对象. +> +> (Eric Evans) + +属性相同但`Id`不同的两个[实体](https://docs.abp.io/zh-Hans/abp/latest/Entities) 被视为不同的实体.但是,值对象没有`Id` + +## 值对象的类 + +值对象是一个抽象类,可以继承它来创建值对象类 + +**示例: An Address class** + +```csharp +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 GetAtomicValues() + { + yield return Street; + yield return CityId; + yield return Number; + } +} +``` + +- 值对象类必须实现 `GetAtomicValues()`方法来返回原始值 + +### ValueEquals + +`ValueObject.ValueEquals(...)` 用于检测两个值是否相等 + +**示例: Check if two addresses are equals** + +```csharp +Address address1 = ... +Address address2 = ... + +if (address1.ValueEquals(address2)) //Check equality +{ + ... +} +``` + +## 最佳实践 + +以下是使用值对象时的一些最佳实践: + +- 如果没有充分的理由将值对象设计为可变的,则将其设计为**不可变**(如上面的地址). +- 构成一个值对象的属性应该形成一个概念整体.例如:CityId,Street和Number不应是个人实体的单独属性.这也使Person实体更简单. + +## 另请参阅 + +- [实体](Entities.md)