一、引子

聊架构总离不开“领域驱动架构”,大多能聊到DDD(Domain-Driven Design),实际上早期思想EBI架构 1992年就诞生了。核心价值点在于:关注核心业务领域(高内聚),分离实现层(低耦合)。后续一些演变架构有:端口和适配器架构、洋葱架构、整洁架构、事件驱动架构。这一系列的架构演变,每个架构的核心思想了解下就好,不用纠结实现细节。

二、架构演变

2.1 EBI 架构(1992)

EBI 架构(Entity-Boundary-Interactor,实体-边界-交互器)是Ivar Jacobson 在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出的。附上2012年来北京讲座的照片,混个脸熟。

最早,Jacobson 把它叫做实体-接口-控制(Entity-Interface-Control),但是后来改成了 EBI,避免“接口”和编程语言中的结构“接口”混淆,以及“控制”和 MVC 中的“控制器”混淆。如下图所示:

这个图是不是很熟悉?没错,就是UML!Ivar Jacobson就是UML的三大创始人之一。

核心:

  • Entity实体:实体对象承载着相关业务领域的数据和操作。对应着MVC的Model层。
  • Boundary边界:边界对象是对系统接口的建模。所有依赖系统环境(工具和传达机制)的功能都属于边界对象。对应着 MVC 中的 View 和 Controller 的整个展现层。
  • Interactor交互器:代表了展现层和实体之间的连接,也就是应用服务(编排用例)和领域服务(DDD概念)。

优点:

  • 通过职责的封装将系统的变化控制在局部(最好是一个对象)。(单一职责原则)

2.2 DDD领域驱动设计(2003)

Eric Evans 于 2003 年出版了《领域驱动设计:软件核心复杂性应对之道》,在书中他创造了领域驱动设计方法。是“领域驱动“领域的指明灯。DDD把实现分为4个大层次,如下图:

分层:
  • 1.User Interface用户界面层:负责绘制和应用交互的屏幕界面并将输入翻译成应用的命令。它们和EBI架构中的Boundary边界对象对应。
  • 2.Application应用服务层:协调领域对象完成用例。它不包含业务逻辑。应用层和EBI架构中的Interactor交互器相对应,只有一点不同,交互器是和界面或实体无关的任意对象,而这里应用层只包含和用例相关的对象。
  • 3.Domain领域层:这个层次包含了所有的业务逻辑,如领域服务、实体、事件和其他包含业务逻辑的任意对象类型。它和 EBI 架构中的Entity实体对象类型对应。
  • 4.Infrastructure基础设施层:支持上述三个层次的技术能力,例如,持久化或者消息机制。

核心:

  领域模型准确反映了业务语言,而传统数据对象除了简单setter/getter方法外,没有任何业务方法,即失血模型,那么DDD领域模型就是充血模型(业务方法定义在实体对象中)。

优点:

  • 首次清晰描述了领域驱动的分层实现并统一了业务语言。
  • 单一职责、低耦合、高内聚、业务内核沉淀。

2.3 端口和适配器架构(2005)

2005年,Alistair Cockburn构思了端口和适配器架构 (又称六边形架构)并记录在他的博客中。下面这句话就是他对该架构的目标的定义:

让用户、程序、自动化测试和批处理脚本可以平等地驱动应用,让应用的开发和测试可以独立于其最终运行的设备和数据库。——Alistair Cockburn 2005,端口和适配器     如下图所示:

核心:

  1. 左侧: 代表 UI 的适配器被称为主适配器,它们发起了对应用的一些操作,端口(应用层API)和它的具体实现(controller实现)都在应用内部。
  2. 右侧: 表示和后端工具链接的适配器,被称为从适配器,它们只会对主适配器的操作作出响应,端口在应用内部(业务接口),具体实现(impl)在应用之外。

优点:

  1. 业务应用和实现(技术)隔离。(面向接口编程)

  2. 方便测试。(基于接口)

2.4 洋葱架构(2008)

2008 年 Jeffrey Palermo 提出了洋葱架构。在我看来,它在端口和适配器架构的基础上贯彻了将领域放在应用中心,将传达机制(UI)和系统使用的基础设施(ORM、搜索引擎、第三方 API...)放在外围的思路。

洋葱架构在业务逻辑中加入了一些在“领域驱动设计”中被识别出来的层次。如下图:

核心:

  • 围绕独立的对象模型构建应用。
  • 内层定义接口,外层实现接口。
  • 依赖的方向指向圆心。
  • 所有的应用代码可以独立于基础设施编译和运行。

优点:

  • 职责分离更彻底,高内聚低耦合。
  • 更好的可测试性和可维护性。

2.5 整洁架构(2012)

Robert C. Martin(Uncle Bob)于2012年发表了整洁架构。这套架构是站在巨人的肩膀上,把MVC、EBI、端口适配器、洋葱架构、DDD融会贯通,形成了一套落地实践方案。

四层模型:
  • Enterprise Business Rules  企业级业务规则层:核心业务内聚(对应DDD的领域服务+领域实体)。
  • Application Business Rules 应用级业务规则层:应用层业务编排。
  • Interface Adapters              接口适配层:数据转化。
  • Frameworks & Drivers        框架和驱动层:底层实现和数据库等驱动。

Robert C. Martin有一份落地细节图,如下:

核心:

  • 前端(左边)就是MVPVM架构(MVC的一种最贴合现代的延伸架构)
  • 后端(右边)是EBI架构(Entity-Boundary-Interactor)

优点:

  • 它告诉我们如何把所有的概念、规则和模式整合起来,形成一种标准实现套路。

三、总结

纵观EBI架构、DDD领域驱动设计、端口适配器架构、洋葱架构、整洁架构。完全没有冲突,就是领域设计的完美落地历史。一张图归纳之:

==========参考===============

https://www.jianshu.com/p/d3e8b9ac097b

2008 – Jeffrey Palermo – The Onion Architecture: part 1

2008 – Jeffrey Palermo – The Onion Architecture: part 2

2008 – Jeffrey Palermo – The Onion Architecture: part 3

2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years

https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

EBI、DDD及其演变架构史的更多相关文章

  1. DDD不是架构设计方法

    DDD不是架构设计方法 一文读懂DDD 2019-05-28 19:18 by 春哥大魔王, 413 阅读, 3 评论, 收藏, 编辑 何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,D ...

  2. 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》

    “周三分享”是盛派网络约定的每周三晚上定时举办的内部分享活动,活动主要由技术人员分享各方面的技术主题,并由所有参与者围绕主题进行讨论.除技术话题外,也可能涉及到相关的设计.财税.金融.政策等方面的延伸 ...

  3. 【转载】DDD分层架构的三种模式

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  4. DDD分层架构的三种模式

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  5. 如何一步一步用DDD设计一个电商网站(二)—— 项目架构

    阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...

  6. DDD CQRS架构和传统架构的优缺点比较

    明天就是大年三十了,今天在家有空,想集中整理一下CQRS架构的特点以及相比传统架构的优缺点分析.先提前祝大家猴年新春快乐.万事如意.身体健康! 最近几年,在DDD的领域,我们经常会看到CQRS架构的概 ...

  7. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

  8. DDD~DDD从零起步架构说明

    回到目录 看了传说中的弦哥对园子里.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓),我也来说说我的DDD架构吧,主要是看了微软NlayerApp之后,自己写的一个,以后将会应用到 ...

  9. 应用程序框架实战十三:DDD分层架构之我见(转)

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

随机推荐

  1. 「雅礼集训 2017 Day2」水箱 (数据结构+dp ,一个log)

    题面 题解 在网上看到有些做法,有什么平衡树.启发式合并等等总之复杂度O(Tnlog^2(n))的不优做法,这里我就用一个O(Tnlogn)的做法好了 其实大体上推导的思路都是一样的. 我们很容易发现 ...

  2. Mac隔空投送功能

    使用mac 或iphone 的隔空投送功能可以互发文件,亲测可用 具体可以看mac的文档 需要注意的是: 如果是mac传iphone,iphone会显示你需要存储文件的地方,比如选择在文稿中.然后在文 ...

  3. docker-compose概述--翻译

    Overview of Docker Compose 译文 Docker Compose 是一个用来定义和执行多Docker容器程序的工具,如果使用Compose,你将可以使用一个YAML文件来配置你 ...

  4. 干货分享!JAVA诊断工具Arthas在Rainbond上实践~

    别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...

  5. 第一篇博客:HTML:background的使用

    开篇 我是一名程序员小白,这是我写的第一篇博客,在学习的路上难免会遇到难以解决的问题,我将会在这里写下我遇到的问题并附上解决方法 希望可以对各位有所帮助!! 我们在html中经常会遇到这样的问题 例如 ...

  6. day03-2无异常退出

    多用户即时通讯系统03 4.编码实现02 4.3功能实现-无异常退出系统 4.3.1思路分析 上述代码运行时,在客户端选择退出系统的时候,可以发现程序并没有停止运行,原因是: 退出时,程序将循环标志l ...

  7. 使用traefik进行流量复制

    文章转载自:https://mp.weixin.qq.com/s/nMMN7hAJK6SFn1V1YyxvHA Traefik 2.0 还引入了镜像服务,一种可以将流入流量复制并同时将其发送给其他服务 ...

  8. 几篇关于MySQL数据同步到Elasticsearch的文章---第五篇:logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解

    文章转载自: https://blog.csdn.net/laoyang360/article/details/51747266 引言: elasticsearch 的出现使得我们的存储.检索数据更快 ...

  9. 文档的CURD

    Index方式,需要指定ID 如果ID不存在,创建新的文档,状态是created 如果ID存在,会先删除现有ID的文档,然后创建一个新文档,ID数加1,状态是updated PUT test/_doc ...

  10. WPF开发经验-实现自带触控键盘的TextBox

    一 引入 项目有个新需求,当点击或触碰TextBox时,基于TextBox的相对位置,弹出一个自定义的Keyboard,如下图所示: 二 KeyboardControl 先实现一个自定义的Keyboa ...