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\,为了能够更方便的创建值对象,我们可以继承该基类。如:Address 值对象:

public class Address : ValueObject

{

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 mysql guid_ABP领域层 – 值对象 - ABP 中文文档相关推荐

  1. mysql t 保存_检查 (调试) - 离线消息保存到 MySQL - 《EMQ X Enterprise v4.1 中文文档》 - 书栈网 · BookStack...

    离线消息保存到 MySQL 搭建 MySQL 数据库,并设置用户名密码为 root/public,以 MacOS X 为例: $ brew install mysql $ brew services ...

  2. emq数据储存到mysql,规则引擎示例 - 保存数据到 MySQL - 《EMQ X Enterprise v4.0 中文文档》 - 书栈网 · BookStack...

    保存数据到 MySQL 搭建 MySQL 数据库,并设置用户名密码为 root/public,以 MacOS X 为例:$ brew install mysql $ brew services sta ...

  3. mysql 5.7安装vsvcr_MySql 5.7 中文文档 - 2.1.3.2 使用 GnuPG 进行签名检查 | Docs4dev

    验证包装完整性和真实性的另一种方法是使用加密签名.这比使用MD5 checksums更可靠,但需要更多工作. 我们使用 GnuPG (GNU Privacy Guard)签署 MySQL 可下载的软件 ...

  4. Yul语言及对象说明——Solidity中文文档(9)

    写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第九部分<Yul语言及对象说明>,特发布出来邀请solidity爱好者.开 ...

  5. mysql的float取值范围_MYSQL中支持的数据类型及取值范围

    下表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1字节 -128~127 0~255 小整数值 SMALLINT 2字节 ...

  6. [Eigen中文文档] 按值将Eigen对象传递给函数

    文档总目录 本文目录 按值传递和按引用传递 Eigen的处理 英文原文(Passing Eigen objects by value to functions) 按值传递和按引用传递 按值传递:传入函 ...

  7. abp+dapper+mysql_ABP公共结构 – 时间与时区设置 - ABP 中文文档

    2.6 ABP公共结构 – 时间与时区设置 2.6.1 简介 虽然有些应用的需求是单时区,然而另一些是需要对不同的时区进行处理的.为了满足这样的需求以及对时间的处理.ABP提供了处理时间操作的通用基础 ...

  8. mysql编程游标取值_mysql存储过程中使用游标的实例

    DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day dateti ...

  9. dropout层加在哪里_常用层 - Keras中文文档

    常用层 常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接.激活层等 Dense层 keras.layers.core.Dense(units, activation=None ...

最新文章

  1. [Zabbix] 怎样实现邮件报警通知以及免费短信报警通知
  2. request.getContextPath()的功能
  3. 面向对象的程序设计-模块二课程总结
  4. java语言基础与go语言基础,数据类型区别
  5. 《 线性代数及其应用 (原书第4版)》——1.2 行化简与阶梯形矩阵
  6. C++之inline函数使用总结
  7. 第46届ICPC亚洲区域赛(沈阳)L-Perfect Matchings【dp,组合数学】
  8. dos命令查看oracle_home,Oracle - OraDb10g_home1配置方法+DOS命令
  9. 模拟电子技术不挂科学习笔记2(三极管、场效应管)
  10. Discuz!NT CreditsOperationType
  11. vue文件上传 vue-simple-upload的使用方法
  12. java 信号处理模块_GitHub - Astoros-Fung/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  13. ie浏览器兼容模式怎么设置?
  14. H5调用微信扫一扫识别二维码
  15. 单片机系统电路原理图设计
  16. PHP学习之如何写一个项目?需求分析
  17. 怎么知道服务器是否正版,盗版太坑爹!五招识别Win7旗舰版正版
  18. 美国计算机专业gre314,美国东北大学计算机专业CS硕士录取
  19. spring interation学习-01发送jms消息
  20. Windows Mobile 播放声音文件

热门文章

  1. 五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解
  2. 微信开发2之php网页授权登录
  3. 服务器系统上1068错误,错误1068,详细教您启动网络服务错误1068怎么解决
  4. 初探EntityFramework——来自数据库的Code First
  5. python福利彩随机_看大神如何用Python分析福利彩票的秘密,百万大奖不是梦!
  6. fastai学习:05_pet_breeds Questionnaire
  7. 用java创建窗口程序,创建窗口的应用程序
  8. 如何在Win11上快速加密硬盘 Win11上快速加密硬盘方法步骤
  9. Firefox鼠标手势插件在哪安装 火狐浏览器鼠标手势怎么用
  10. jeecg扩展字段,非实体属性