3.2 ABP领域层 - 值对象

3.2.1 简介

用来描述领域的特殊方面、且没有标识符的一个对象,叫做值对象。

实体有自己的唯一标识,而值对象是没有标识的。如果两个实体的标识是不同的,那么它们是两个不同的实体,即使这两个实体的其它属性值是相同的。想象一下两个不同的人但是他们有相同的姓和名以及年龄。但是,他们的标识是不同的话,那么他们就是不同的两个人。但是,对于地址(这是一个典型的值对象)类,如果这两个地址拥有相同的国家,城市,街道号等等。那么它们就是同一个地址。

在DDD中,值对象是领域对象的另一种类型,它可以包含业务逻辑并且是领域中不可或缺的一部分。

3.2.2 DDD中重要概念

实体entity:

拥有唯一标识符一类对象,
但对象不是通过它们的属性定义的,而是通过一连串的连续性事件和标识定义的。

值对象-value Object

  • 1.对某个对象是什么不感兴趣,只关心它拥有的属性

  • 2.用来描述领域的特殊方面、且没有标识符的一个对象,叫做值对象

  • 3.能被简单的创建和丢弃,生命周期中不会被持久化

  • 4.值对象可以被共享,值对象应该不可变

服务-service(比webservice更细粒度服务描述)

  • 1.领域中的一些动词,代表了领域中的一个重要的行为,却不属于任何对象

    • 1)服务执行的操作涉及一个领域概念,这个领域概念通常不属于一个实体或者值对象

    • 2)被执行的操作涉及到领域中的其他的对象

    • 3)操作是无状态的

  • 2.服务对象不再拥有内置的状态

  • 3.服务对象担当重要的协调功能

  • 4.开发通用语言时,领域中的主要概念被引入到语言中,语言中的名词很容易被映射成对象。

语言中对应那些名词的动词变成那些对象的行为。但是有些领域中的动作,它们是一些动词,看上去却不属于任何对象。它们代表了领域中的一个重要的行为,所以不能忽略它们或者简单的把它们合并到某个实体或者值对象中。给一个对象增加这样的行为会破坏这个对象,让它看上去拥有了本该属于它的功能。

模块

  • 1.将相关领域模型提炼分类,分而治之

  • 2.将高关联度的模型分组到一个模块以提供尽可能大的内聚(以能完整完成任务为准)

  • 3.分层是水平划分

  • 4.模块是垂直划分(Domain内部)

3.2.3 值对象基类

ABP有一个基类 ValueObject\

public class Address : ValueObject<Address>
{public Guid CityId { get; private set; } //对城市实体的引用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", 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);

即使它们在内存中是不同的对象,但是在领域中它们是相同的。

3.2.4 最佳实践

这里有一些对值对象设计建议:

  • 值对象应该被设计为不可变的(如上面的Address值对象)

  • 构成一个值对象的属性应该形成一个概念上的整体。例如:CityId,街道和号码不应该是构成Person实体的一部分,应该分离出来作为Address值对象。这样也使Person实体更简单。

ABP官方文档(十六)【值对象】相关推荐

  1. ABP官方文档(十八)【领域服务】

    3.4 ABP领域层 - 领域服务 3.4.1 简介 领域服务(或者服务,在DDD模式中)是被用来执行领域操作或者业务规则的.Eric Evans 在他的DDD书中这样说过:一个好的Service应该 ...

  2. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  3. ABP官方文档(十七)【仓储】

    3.3 ABP领域层 - 仓储 仓储定义:"在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象"(Martin Fowler). 实际上,仓储被用于领域对象在数据库上的操 ...

  4. ajax访问带token abp,ABP官方文档(三十八)【AJAX API】

    6.6 ABP表现层 - AJAX API 6.6.2.1 AJAX操作问题 现代的应用经常会使用AJAX,尤其是单页应用,几乎是和服务器通信的唯一手段,执行AJAX通常会有以下步骤: 基本上:为了执 ...

  5. ABP官方文档(三十)【动态WebApi层】

    5.2 ABP表现层 - 动态WebApi层 5.2.1 建立动态WebApi控制器 这是一篇关于ASP.NET Web API的文档.如果你对ASP.NET感兴趣,请阅读ASP.NET Core文档 ...

  6. ABP官方文档(四十四)【后台作业和后台工人】

    7.1 ABP后台服务 - 后台作业和后台工人 7.1.1 简介 ABP提供了后台作业和后台工人,来执行应用程序中的后台线程的某些任务. 7.1.2 后台作业 由于各种各样的原因,你需要后台作业以队列 ...

  7. ABP官方文档(十三)【对象之间的映射】

    2.7 ABP公共结构 - 对象之间的映射 2.7.1 简介 我们通常需要在近似的对象之间进行映射处理.这是一个重复且枯燥无味的工作,通常来说两个需要相互映射的对象之间有近似的或者相同的属性.思考一下 ...

  8. ABP官方文档(四十五)【集成Hangfire】

    7.2 ABP后台服务 - 集成Hangfire 7.2.1 简介 Hangfire是一个综合性的后台作业管理工具.你可以用Hangfire来替换ABP中默认实现的后台作业管理者.你可以对Hangfi ...

  9. ABP官方文档(四十九)【集成EntityFramework】

    9.1 ABP基础设施层 - 集成Entity Framework ABP可以与任何ORM框架协同工作,它内置了对EntityFramework的集成支持.本文将介绍如何在ABP中使用EntityFr ...

最新文章

  1. win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx‘, ‘系统找不到指定的文件。‘)
  2. Python的安装、pycharm的安装及设置
  3. 不同项目之间的控件共享
  4. python 开发gui浏览器_Python编程之gui程序实现简单文件浏览器代码
  5. 18年石油大学c语言网考答案,石油大学华东C语言2018在线考试.doc
  6. cocos2d学习路线
  7. 使用QuickCHM软件轻松编译CHM格式的文件
  8. (C/C++学习笔记) 十二. 指针
  9. java 微信公众号js接入_SpringCloud : 接入 微信公众号平台(三)、获取JsSDK配置参数...
  10. 《网管员必读——网络基础》(第2版)电子课件下载
  11. 携程实时计算平台架构与实践丨DataPipeline
  12. 数据结构图之一(基本概念,存储结构,两种遍历)
  13. Attach and Detach in VC
  14. 初探 Yii2 的测试模式 index-test.php
  15. 在VMware下安装中标麒麟操作系统7.0以及Neokylin基础常用知识
  16. Cauchy-Schwarz不等式
  17. 网络空间安全 渗透 攻防5(文件共享服务器)
  18. 商汤科技2020笔试题
  19. python storm连接mysql_Python ORM Storm 源码修改
  20. 帆软函数:阿拉伯数字转中文、阿拉伯数字转人民币大写

热门文章

  1. 应用预测建模第四章过度拟合与模型调优习题4.4【分层随机抽样、小样本的模型评估方案】
  2. c语言递归方法排序,归并排序,递归法,C语言实现。
  3. 通用台式计算机的用户需求书,电脑、外设及网络维护服务合同协议书范本 通用版...
  4. 屁孩君儿子讲解 2023 【例4.8】数据统计
  5. python 杂志_Python周刊中文版(第475期)
  6. JavaSE的日记本的设计与实现
  7. python斐波那契螺旋线怎么画向日葵心_“斐波那契螺旋线”的图形作法是什么?...
  8. 腾讯云轻量服务器香港节点24元30M峰值带宽很值得
  9. Android 禁止应用截屏和录屏
  10. EPC纠偏液压系统比例阀控制器