Abp mysql guid_ABP领域层 – 值对象 - ABP 中文文档

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实体更简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(分治法)归并排序

分治算法一般分为如下3个步骤。 划分问题:把问题的实例划分成子问题。 递归求解:递归解决子问题。 合并问题:合并子问题的解得到原问题的解。 归并排序 按照分治三步法,对归并排序算法介绍如下。 划分问题:把序列…

mysql order by rand 优化_mysql order by与by rand() 的优化经验

介绍下MySQL中的order by语句。几种order by的情况从最简单的case开始看起。用这个表来说明:(10w行数据)1、 最简单的order ―― order by索引字段从explain的结果来看(Extra列),这个语句并不作排序。因为字段a已经是有顺序的。就是按照索引a的顺序依次…

(分治)逆序对问题

题目&#xff1a; 给一列数a1,a2,…,an&#xff0c;求它的逆序对数&#xff0c;即有多少个有序对(i,j)&#xff0c;使得i< j但ai>aj。n可以高达1e6 分析与解答 由于是从小到大进行合并操作&#xff0c;可以发现如果右半数组的元素q放入临时空间中&#xff0c;那么左半…

python locust api_干货 | 基于Locust的接口压测

作者介绍&#xff1a;吴锋雷。PP云高级测试工程师&#xff0c;拥有10年业务研发和测试经验&#xff0c;目前负责SDK及相关产品的测试工作。系统上线前一般要通过压力测试来判断下是否能承受预估的访问量&#xff0c;假设我们要测试的接口每天访问量是10万&#xff0c;那么平均下…

(贪心)背包问题

1.最优装载问题。 给出n个物体&#xff0c;第i个物体重量为wi。选择尽量多的物体&#xff0c;使得总重量不 超过C。 由于只关心物体的数量&#xff0c;所以装重的没有装轻的划算。只需把所有物体按重量从小到大 排序&#xff0c;依次选择每个物体&#xff0c;直到装不下为止。…

(贪心)区间问题大致思路

1.选择不相交区间。 a.描述&#xff1a; 数轴上有n个开区间(ai, bi)。选择尽量多个区间&#xff0c;使得这些区间两两 没有公共点。 b.思路总结&#xff1a; 1.区间x完全包含y&#xff0c;选y 2.按照bi从小到大排序&#xff0c;从第一个区间开始选 3.把所有和上一个区间相…

python queue windows_python Queue模块

创建一个“队列”对象import Queuemyqueue Queue.Queue(maxsize 10)Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。将一个值放入队列中myqueue.put(10)调用队…

STM32的DHT11

DHT11基础 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术&#xff0c;确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件&#xff0c;并与一个高性能…

(priority_queue)自定义优先级

思考与总结&#xff1a; 1.优先队列&#xff0c;先出队列元素不是先进队列的元素&#xff0c;而是队列中优先级最高的元素 2.遇到这种题一般把每一个数据封装到一个struct里 3.然后根据优先级判断依据&#xff0c;我们通过重定向定义优先队列的优先级 如果我们写bool opera…

python 如何匹配列表中某个单词_Python中部分指定单词的最佳匹配项

如果要重复执行此操作&#xff0c;应创建一个索引&#xff1a;wordlist [word.strip() for word in "run, ran, rat, rob, fish, tree".split(,)]from collections import defaultdictclass Index(object):def __init__(self, wordlist()):self.trie defaultdict(s…

sigkill mysql_Ubuntu不能停止mysqld

我尝试运行服务mysql stop,killall -s SIGKILL mysqld,/etc/init.d/mysql停止,并停止mysql,但仍然看到这个输出从ps aux | grep mysql&#xff1a;root 32302 0.0 0.3 59040 2120 pts/8 S 06:03 0:00 sudo mysqld_saferoot 32305 0.0 0.1 4440 772 pts/8 S 06:03 0:00 /bin/sh …

java中函数_java中的函数

函数的概述1.函数定义: 能完成特定功能的代码段就是函数,每一个函数都是一个独立的小功能2.为什么要有: 如果没有函数,在实现一个功能时候,就要写一遍这个逻辑, 如果功能多次使用,就会产生大量重复的代码.有了函数之后,把这个功能封装到函数中,当你在使用这个功能时候不需要再写…

(dag模型+最长路+字典序)嵌套矩形

题目&#xff1a; 有 n 个矩形&#xff0c;每个矩形可以用两个整数 a, b 描述&#xff0c;表示它的长和宽。矩形 X(a, b) 可以嵌套在矩形 Y(c, d) 中当且仅当 a&#xff1c;c, b&#xff1c;d&#xff0c;或者 b&#xff1c;c, a&#xff1c;d&#xff08;相当于把矩形 X 旋转…

Java智能卡 技术_java智能卡APDU学习笔记

因项目需要&#xff0c;利用APDU通信协议在ME手机端和卡端进行通讯。在实践的过程中遇到一些问题&#xff0c;先记录如下。APDU协议&#xff0c;即是智能卡与读写器间的应用层协议&#xff0c;在ISO7816-4[7]中定义了该协议的结构格式。APDU数据有两种结构&#xff0c;读写器使…

(二叉树存储+递归遍历)Binary Tree Traversals

题目&#xff1a; A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called the left and right subtrees. There are three most important ways in which the vertices of a binary tree can be sys…

java mutator_Java-使用Accessor和Mutator方法

小编典典让我们看一下基础知识&#xff1a;“ Accessor”和“ Mutator”只是获取器和设置器的奇特名称。一个获取器“Accessor”返回一个类的变量或其值。设置器“ Mutator”设置类变量指针或其值。因此&#xff0c;首先您需要设置一个带有一些要获取/设置的变量的类&#xff1…

(二叉树创建+查找)精灵邮差

题目 精灵是非常奇特的生物。众所周知&#xff0c;他们可以活很长时间&#xff0c;他们神奇的能力不是一件容易接受的事情。此外&#xff0c;他们住在树上。但是&#xff0c;你可能不知道有些事情。虽然通过魔法传送提供东西非常方便&#xff08;很像电子邮件&#xff09;。他…

java反序列化异常接不到_由Java对象反序列化异常想到的

今天写代码时候遇到一个异常&#xff0c;异常信息如下&#xff1a;Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.spri…

(找规律)Magic of David Copperfield

题目&#xff1a; 每一个参与的观众被要求将手指放在左上方的图片上&#xff08;即编号为1的图片&#xff09;&#xff0c;魔术师开始了&#xff1a;魔术师告诉观众在图片上移动k次&#xff08;移动是把手指放到上下左右相邻的图片上&#xff0c;如果那儿有图片的话&#xff0…

java 日期只计算年月日大小_Java 计算两个日期相差多少年月日

JDK7及以前的版本&#xff0c;计算两个日期相差的年月日比较麻烦。JDK8新出的日期类&#xff0c;提供了比较简单的实现方法。/*** 计算2个日期之间相差的 相差多少年月日* 比如&#xff1a;2011-02-02 到 2017-03-02 相差 6年&#xff0c;1个月&#xff0c;0天*paramfromDate Y…