值对象

介绍

  "展现领域描述性层面且没有概念性身份的对象称之为值对象。"(Eric Evans)。

  和实体相反,实体有身份标示(Id),值对象没有身份标示。如果两个实体的身份标示是不同的,那么就认为他们是不同的对象/实体,即使他们的所有属性都是一样的。考虑两个不同的人有相同的名字、姓氏和年龄,但是他们是不同的人,如果他们的身份编号不同的话。但是,对于一个地址(经典的值对象)类,如果两个地址有相同的国家、城市、街道编号等等,则认为为相同的地址。

  在DDD中,值对象是领域对象的另一种类型,可以包含业务逻辑,是领域的重要组成部分。

值对象基类

  ABP有一个ValueObject<T>基类,可以被继承用来轻松创建值对象类型。Address值对象类型示例如下:

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;
}
}

  值对象基类重写了等于操作符(还有其他相关的操作符和方法)来比较两个值对象,如果两个值对象所有的属性都相等则认为他们是相等的。所以,所有下面的测试都是通过的:

var address1 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", );
var address2 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", ); Assert.Equal(address1, address2);
Assert.Equal(address1.GetHashCode(), address2.GetHashCode());
Assert.True(address1 == address2);
Assert.False(address1 != address2);

  即使在内存中是不同的对象,在我们的领域中也认为他们是完全相同的。

最佳实践

  一些值对象的最佳实践:

  • 将值对象设计为不可变的(如上面的Address类),如果没有好的理由将它设计为可变的话。
  • 组成值对象的属性应形成一个概念上的整体。例如,CityId、Street和编号不应该是一个Person实体分离的属性。这也使得Person实体更简单。

返回主目录

最新文章

  1. PHP取整函数:ceil,floor,round,intval的区别详细解析
  2. 免费电子书:Azure Web Apps开发者入门
  3. Linux绑定双网卡
  4. mysql explain 命令讲解
  5. MongoDB 快速入门--初级
  6. COJ 0503 比赛
  7. js 计算两个日期之间的月数
  8. elasticsearch集群搭建实例
  9. 使用highcharts显示mongodb中的数据
  10. 【POJ2186】受牛仰慕的牛
  11. [ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)
  12. 高仿腾讯QQ最终版
  13. 故障 -&gt; nginx启动失败
  14. Java 简单的rpc 一
  15. mongoDB——自动分片(转)
  16. 切换nPar或vPar的启动模式
  17. kolla-ansible 重新部署 ceph-mon 组件
  18. 连接ES的Java项目报Too many open files错误
  19. 并发包交换数据Exchanger
  20. ZK客户端

热门文章

  1. LibreOJ β Round #2 F. 数学上来先打表
  2. VS2012 TFS解决离职后代码遗留未迁入问题
  3. 关于win10系统安装VMware12Pro后,win10系统的 控制面板\网络和 Internet\网络连接\更改适配器选项卡中 没有虚拟网卡VMnet1和VMnet8图标,该如何把他们显示出来呢?
  4. nth-child()选择器小结
  5. Flask连接数据库打怪升级之旅
  6. Unity LayerMask
  7. C# 小笔记
  8. MLlib--SVD算法
  9. C#中的基元类型、值类型和引用类型
  10. ios开发 第一天