首先,你必须知道以下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. ref、out参数

    ref和out都是表示按引用传递.与指针类似,直接指向同一内存. 按值传递参数的方法永远不可能改变方法外的变量,需要改变方法外的变量就必须按引用传递参数. 传递参数的方法,在C语言里,用指针.在C#里 ...

  2. 互相关(cross-correlation)及其在Python中的实现

    互相关(cross-correlation)及其在Python中的实现 在这里我想探讨一下“互相关”中的一些概念.正如卷积有线性卷积(linear convolution)和循环卷积(circular ...

  3. 十行代码分清Java 的 || 和 &&

    发现有些同学到现在还没分不清 || 和 &&的作用 package System; /** * * @ClassName: RandomTest * @Description: 十行代 ...

  4. 编写高质量的Python代码系列(七)之协作开发

    如果多个人要开发同一个Python程序,那就得仔细商量代码的写法了.即使你是一个人开发,也需要理解其他人所写的模块.本节讲解多人协作开发Python程序时所用的标准工具及最佳做法. 第四十九条:为每个 ...

  5. MySQL巧建sum索引帮我们提高至少100%的效率

    有两个表,表a CREATE TABLE `a` ( `id` mediumint() unsigned NOT NULL AUTO_INCREMENT, `fid` ) unsigned ', `c ...

  6. HTTP常见的状态码——面试题常考

    一些常见的状态码为:  200 - 服务器成功返回网页 400(错误请求)服务器不理解请求的语法. 404 - 请求的网页不存在 500(服务器内部错误)服务器遇到错误,无法完成请求. 503 - 服 ...

  7. Arduino-常用指令

    pinMode(LEDPin,OUTPUT);        //设置引脚模式 参数1      引脚 参数2      OUTPUT  输出:INPUT   输入 用在setup()函数里 digi ...

  8. C# 泛型单例

    不支持非公共的无参构造函数的 public abstract class BaseInstance<T> where T : class,new() { private readonly ...

  9. PyTorch中ReLU的inplace

    0 - inplace 在pytorch中,nn.ReLU(inplace=True)和nn.LeakyReLU(inplace=True)中存在inplace字段.该参数的inplace=True的 ...

  10. PostgreSQL学习笔记(一)-安装PostgreSQL

    PostgreSQL官网:https://www.postgresql.org/docs/11/index.html1.如何安装2.如何修改配置文件3.如何设置自动启动4.如何修改数据用户密码 本文环 ...