DDD - 概述 - 模块 (二)
首先,你必须知道以下DDD构建块:
Entities - 实体
Value objects - 值对象
Aggregate roots - 聚合跟
Repositories - 仓储对象
Factories - 工厂
Services - 服务
1. 实体
一个实体是一个普通对象,有一个身份(ID)和可能是可变的。每个实体都由一个惟一标识ID而不是由一个属性;因此,如果他们两实体有相同的ID,两个实体可以被认为是相同的,即使他们有不同的属性。这意味着实体的状态随时可以改变,但只要两个实体具有相同的ID,都是相等的.
2. 值对象
值对象是不可变的。他们没有身份(ID)像我们发现实体。如果他们有相同的类型和属性(适用于所有的属性),那么这两个值对象可以被认为是相等的。有时候我们在我们的洋葱架构中需要进行消息传递的时候我们可以通过使用值对象去传递,从而能避免直接暴露领域对象.值对象的一些好处:
值对象的使用可以吞下大量的计算复杂度。
分解掉实体的部分逻辑,从而让实体的逻辑简化。
提高可扩展性,比如解决可测试性和并发性的问题.
3.聚合根
聚合根是一个实体与其他实体结合在一起。此外,聚合根实际上是一个总体的一部分(收集/集群相关的对象当作一个单独的单元为目的的数据改变)。因此,每个聚合实际上由一个聚合根和一个边界构成。比如,在销售订单 中,订单Order和订单项OrderLineItem可以被认为是一个聚合,这里的Order(订单)是聚合根对象,这个订单项(orderlineItem)就是订单的子对象.一个聚合根的关键特性之一就是外部对象不允许持有一个聚合根子实体。因此,如果您需要访问一个聚合根子实体(即总),那么你必须经过聚合根(即不能直接访问某一个聚合的子对象)。另一个是域内的所有操作应在可能的情况下,经过一个聚合根。工厂、仓库和服务有一些例外.
4. 仓储
仓库主要是用来处理存储。在DDD中它是一个最重要的概念.因为他们有大量的存储问题中抽象出来(即某种形式/存储机制)。可能是一个基于文件的存储库实现存储,或数据库(SQL - / NoSQL-based),或任何其他有关存储机制,如缓存。任意组合的也是可能的。仓储与数据存储不是一个东西不要混淆。仓储是为数据存储(数据库)服务的。仓储的实现可能需要使用到多个数据源对象。因此,一个聚合根可能来自一个REST API,以及数据库或文件。你可能包装那些所谓的数据存储,但存储库是一种进一步的抽象层上所有的个人数据存储。通常,我实现域/域内的存储库为一个接口服务层内洋葱架构,然后存储库的实现逻辑接口中定义的基础设施层。
5. 工厂
就是我们通常理解的工厂的概念,在DDD中,确切地说在聚合对象中,工厂通常用来返回 一个聚合跟 或一个实体或 一个值对象.很多时候,当你需要一个聚合根的工厂方法,在repository(仓储中)使用。因此,(repository)存储库可能有一个查找器创建方法。通常的 工厂是在domain/domain services layer(领域或领域服务层)定义的接口对象,实现逻辑是在infrastructure layer(基础设施曾)中的. 也就是说 infrastructure 中定义的是 domain/domain service层的工厂接口的实现.
6. 服务
某一部分的操作并不好归结到某一个领域对象,并不适合创建聚合,那么这时候可以考虑创建成services(服务)对象.
其他
我经常发现许多开发人员使用术语VO(值对象)和DTO(数据传输对象)互换。他们认为都是相同的。这对我来说很烦人。这里我想澄清,指的是不同的东西。下图中所示,签证官和DTO的子集POJO /少。一个实体POJO /少也是一个子集。在上面的描述,POJO和少可以互换使用。都是指的是类似的事情。都只是域对象,主要代表域/业务应用程序中的业务对象。POJO(传统的普通Java对象)这个词是由马丁在Java社区,非常受欢迎,而少(普通CLR对象/普通类对象)被广泛用于dotNet。如前所述,DTO,签证官和实体POJO /少的只是一个子集.DTO只是一个简单的数据载体(只有持有数据没有任何逻辑)。因此,它的一般贫血(只包含属性和getter / setter)。DTO绝对是不可变的。通常,我们使用DTO转让对象层和层之间的一个应用程序或应用程序到应用程序或JVM JVM(主要是有用的网络之间减少多个网络调用)。
DDD - 概述 - 模块 (二)的更多相关文章
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- 常用模块二(hashlib、configparser、logging)
阅读目录 常用模块二 hashlib模块 configparse模块 logging模块 常用模块二 返回顶部 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SH ...
- NGINX模块(二)
[Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...
- Python - 模块(二)
目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...
- 模块(二)os hashlib
模块(二)os hashlib 1.序列化模块 1.1 json 将满足条件的数据结构转化成特殊的字符串,并且可以反序列化转回去 # 两对方法 # 1 dumps() loads() ## 多用于网络 ...
- 模块二之序列化模块以及collections模块
模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...
- SSL/TLS 协议运行机制概述(二)
SSL/TLS 协议运行机制概述(二) 在SSL/TLS 协议运行机制概述(一)中介绍了TLS 1.2 的运行机制,现在我们来看年 TLS 1.3 的运行机制.会涉及到SSL/TLS 协议运行机制概述 ...
- 从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
缘起 哈喽大家好,又是周二了,时间很快,我的第二个系列DDD领域驱动设计讲解已经接近尾声了,除了今天的时间驱动EDA(也有可能是两篇),然后就是下一篇的事件回溯,就剩下最后的权限验证了,然后就完结了, ...
- DDD实践切入点(二)
最近发现下面关于上下文的理解有些问题,不太好改,暂时先不改了 承前:大型系统的支撑,应用系统开发思想的变迁,DDD实践切入点(一) 从大比例结构入手已经开始了系统的建设,大家都知道需求是会不断变化不断 ...
随机推荐
- logstash的output配置中指定elasticsearch的template
转自:https://blog.csdn.net/felix_yujing/article/details/78930389 之前采用的是通过filebeat收集nginx的日志,直接到elastic ...
- Django 中的static文件的设置
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ('article',os.path.jo ...
- python模拟蒙特·卡罗法计算圆周率
蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题. 假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x, ...
- Java中interrupt的使用
通常我们会有这样的需求,即停止一个线程.在java的api中有stop.suspend等方法可以达到目的,但由于这些方法在使用上存在不安全性,会带来不好的副作用,不建议被使用.具体原因可以参考Why ...
- 一段充满bug的R程序,慎入 ...
twitter的AnomalyDetection 官网效果图如下: 尝试写了下面这个R程序: get_specify_df <- function(start_ts,stop_ts,categ ...
- html常用标签的取值和赋值操作
我们在html页面当中,面对各种各样的标签,经常需要处理取值和赋值的问题,下面,就把常见的一些html标签元素的取值和赋值操作进行总结整理,以后备用. 1.button:改变button按钮上面的值, ...
- 20155324《网络对抗技术》web安全基础实践
20155324<网络对抗技术>web安全基础实践 实验内容 使用webgoat进行XSS攻击.CSRF攻击.SQL注入 实验问答 SQL注入攻击原理,如何防御 ①SQL注入攻击是攻击者在 ...
- java使用redis数据库
1.安装 Redis 支持 32 位和 64 位,根据实际情况选择不同的安装版本. 安装完成后打开命令提示窗口,切换到redis安装目录,启动redis客户端, redis-cli命令启动redis客 ...
- Loading class `com.mysql.jdbc.Driver'. The new driver class is `com.mysql.cj.jdb 问题
是因为最新的数据库驱动的原因,用较早的版本就可以了. <dependency> <groupId>mysql</groupId> <artifactId> ...
- 强大的Resharp插件(转)
使用VS有段时间了,一直深深的折服于其强大的功能.之前一直听说有Resharp这个工具,小猪一直也没有太在意.直到今天…… 下载安装: http://www.jetbrains.com/resharp ...