首先,你必须知道以下DDD构建块:

  1. Entities - 实体

  2. Value objects - 值对象

  3. Aggregate roots - 聚合跟

  4. Repositories - 仓储对象

  5. Factories - 工厂

  6. Services - 服务

1. 实体

一个实体是一个普通对象,有一个身份(ID)和可能是可变的。每个实体都由一个惟一标识ID而不是由一个属性;因此,如果他们两实体有相同的ID,两个实体可以被认为是相同的,即使他们有不同的属性。这意味着实体的状态随时可以改变,但只要两个实体具有相同的ID,都是相等的.

2. 值对象

值对象是不可变的。他们没有身份(ID)像我们发现实体。如果他们有相同的类型和属性(适用于所有的属性),那么这两个值对象可以被认为是相等的。有时候我们在我们的洋葱架构中需要进行消息传递的时候我们可以通过使用值对象去传递,从而能避免直接暴露领域对象.值对象的一些好处:

  1. 值对象的使用可以吞下大量的计算复杂度。

  2. 分解掉实体的部分逻辑,从而让实体的逻辑简化。

  3. 提高可扩展性,比如解决可测试性和并发性的问题.

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 - 概述 - 模块 (二)的更多相关文章

  1. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  2. 常用模块二(hashlib、configparser、logging)

    阅读目录 常用模块二 hashlib模块 configparse模块 logging模块   常用模块二 返回顶部 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SH ...

  3. NGINX模块(二)

    [Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...

  4. Python - 模块(二)

    目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...

  5. 模块(二)os hashlib

    模块(二)os hashlib 1.序列化模块 1.1 json 将满足条件的数据结构转化成特殊的字符串,并且可以反序列化转回去 # 两对方法 # 1 dumps() loads() ## 多用于网络 ...

  6. 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...

  7. SSL/TLS 协议运行机制概述(二)

    SSL/TLS 协议运行机制概述(二) 在SSL/TLS 协议运行机制概述(一)中介绍了TLS 1.2 的运行机制,现在我们来看年 TLS 1.3 的运行机制.会涉及到SSL/TLS 协议运行机制概述 ...

  8. 从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解

    缘起 哈喽大家好,又是周二了,时间很快,我的第二个系列DDD领域驱动设计讲解已经接近尾声了,除了今天的时间驱动EDA(也有可能是两篇),然后就是下一篇的事件回溯,就剩下最后的权限验证了,然后就完结了, ...

  9. DDD实践切入点(二)

    最近发现下面关于上下文的理解有些问题,不太好改,暂时先不改了 承前:大型系统的支撑,应用系统开发思想的变迁,DDD实践切入点(一) 从大比例结构入手已经开始了系统的建设,大家都知道需求是会不断变化不断 ...

随机推荐

  1. BAT面试经验分享——iOS高级开发工程师的自我总结!

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,随着各大公司秋招的开始,很多小伙伴都行动起来了,我也有幸获得了一份不 ...

  2. CountDownLatch、CyclicBarrier、Semaphore共同之处与区别以及各自使用场景

    区别 CountDownLatch 使一个线程A或是组线程A等待其它线程执行完毕后,一个线程A或是组线程A才继续执行.CyclicBarrier:一组线程使用await()指定barrier,所有线程 ...

  3. python的数据类型及运用

    int: 主要方法:a.bit.length()———将a转化为二进制的最小位数: bool: false/True str——>bool: s='空'——>false s=“非空”——& ...

  4. DirectX11 With Windows SDK--23 立方体映射:动态天空盒的实现

    前言 上一章的静态天空盒已经可以满足绝大部分日常使用了.但对于自带反射/折射属性的物体来说,它需要依赖天空盒进行绘制,但静态天空盒并不会记录周边的物体,更不用说正在其周围运动的物体了.因此我们需要在运 ...

  5. ArcGis Python脚本——将细碎小面合并到相邻的面积最大的面

    参数: polygon_fc 面要素类 area_limit 给定面积值,小于它的面会被合并 给定两个参数即可,这回没有注释. #polygon_fc 面要素类 #area_limit 给定面积值,小 ...

  6. 神奇的 UNICODE 字符 : U+202E

  7. JGUI源码:DataTable固定列样式(20)

    本来感觉这个固定列很容易实现的,一般都是几个table组合实现,真正自己从头做的时候,发现有很多坑,本文只是固定列原理,真正实现datatable的话,代码量比较大的,后续再进行完善. 使用左中右三个 ...

  8. 找出链表中倒数第K个结点

    思路:两个指针,也是快指针和慢指针,先让快指针走k -1步,这时慢指针开始和快指针一起走到尾部.慢指针停止的点就是倒数第k个节点. public static ListNode findCountDo ...

  9. UEFI+GPT安装WIN7,WIN8/WIN10下安装WIN7双系统

    一.BIOS更改 首先来bios更改:我们知道,uefi+gpt引导虽然出来的时间比较长,但是win7还不能完全的支持,所以在使用uefi+gpt安装win7的时候就会出现各种错误!所以我们在安装Wi ...

  10. United States Department of Agriculture 美国农业部网站数据自动下载小脚本

    帮对象写的自动点击页面的小脚本,如果有需要的可以试试,(#^.^#) https://apps.fas.usda.gov/gats/ExpressQuery1.aspx var year = '199 ...