首先,你必须知道以下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. 小白月赛13 B小A的回文串 (马拉车算法求最长回文子串)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  2. Sql知识点总结

    一.数据库对象:表(table) 视图(view) 序列(sequence) 索引(index) 同义词(synonym) 视图(view) : 存储起来的 select 语句 create view ...

  3. 树莓派中QT实现PWM

    树莓派中QT实现PWM 在QT中实现 PWM 使用的驱动为 wiringPi 之前的博客中已经介绍了 wiringPi , BOARD 管脚, BCM 之间的关系 这次, 就介绍在 wiringPi ...

  4. Redisson实现分布式锁

    转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...

  5. Maven 学习总结 (六) 之 版本

    版本管理 版本管理是指项目整体版本的演变过程管理.版本控制是指借助版本控制工具(如Subversion)追踪代码的每一个变更. 为了方便团队合作,项目开发过程中,大家应该使用快照版本,快照版本机制促进 ...

  6. Telegraf+InfluxDB+Grafana搭建服务器监控平台

    Telegraf+InfluxDB+Grafana搭建服务器监控平台 tags:网站 个人网站:https://wanghualong.cn/ 效果展示 本站服务器状态监控:https://statu ...

  7. sql0001

    001.   https://blog.csdn.net/qinshi965273101/article/details/81907658 002.    https://blog.csdn.net/ ...

  8. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...

  9. Excel表格中依据某一列的值,将这列中一样的数据放在一个文件中。

    一需求:按照标题C的内容,一样的数据整理到一个文件中. 二.操作: 1.atl+F11弹出vb窗口 2.点击       插入===>模块   ,复制以下代码,注意这是一个表头为三行的函数(保存 ...

  10. 【ShaderToy】基本操作——旋转

    *继续:ShaderToy基础学习中d(`・∀・)b 对每个像素点进行旋转,其实加个公式就ok了啊. 对网格进行旋转: 代码如下: #define TUTORIAL 2 #define PI 3.14 ...