EBI、DDD及其演变架构史
一、引子
聊架构总离不开“领域驱动架构”,大多能聊到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)

- 1.User Interface用户界面层:负责绘制和应用交互的屏幕界面并将输入翻译成应用的命令。它们和EBI架构中的Boundary边界对象对应。
- 2.Application应用服务层:协调领域对象完成用例。它不包含业务逻辑。应用层和EBI架构中的Interactor交互器相对应,只有一点不同,交互器是和界面或实体无关的任意对象,而这里应用层只包含和用例相关的对象。
- 3.Domain领域层:这个层次包含了所有的业务逻辑,如领域服务、实体、事件和其他包含业务逻辑的任意对象类型。它和 EBI 架构中的Entity实体对象类型对应。
- 4.Infrastructure基础设施层:支持上述三个层次的技术能力,例如,持久化或者消息机制。
核心:
领域模型准确反映了业务语言,而传统数据对象除了简单setter/getter方法外,没有任何业务方法,即失血模型,那么DDD领域模型就是充血模型(业务方法定义在实体对象中)。
优点:
- 首次清晰描述了领域驱动的分层实现并统一了业务语言。
- 单一职责、低耦合、高内聚、业务内核沉淀。
2.3 端口和适配器架构(2005)

核心:
- 左侧: 代表 UI 的适配器被称为主适配器,它们发起了对应用的一些操作,端口(应用层API)和它的具体实现(controller实现)都在应用内部。
- 右侧: 表示和后端工具链接的适配器,被称为从适配器,它们只会对主适配器的操作作出响应,端口在应用内部(业务接口),具体实现(impl)在应用之外。
优点:
业务应用和实现(技术)隔离。(面向接口编程)
- 方便测试。(基于接口)
2.4 洋葱架构(2008)
洋葱架构在业务逻辑中加入了一些在“领域驱动设计”中被识别出来的层次。如下图:

核心:
- 围绕独立的对象模型构建应用。
- 内层定义接口,外层实现接口。
- 依赖的方向指向圆心。
- 所有的应用代码可以独立于基础设施编译和运行。
优点:
- 职责分离更彻底,高内聚低耦合。
- 更好的可测试性和可维护性。
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及其演变架构史的更多相关文章
- DDD不是架构设计方法
DDD不是架构设计方法 一文读懂DDD 2019-05-28 19:18 by 春哥大魔王, 413 阅读, 3 评论, 收藏, 编辑 何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,D ...
- 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》
“周三分享”是盛派网络约定的每周三晚上定时举办的内部分享活动,活动主要由技术人员分享各方面的技术主题,并由所有参与者围绕主题进行讨论.除技术话题外,也可能涉及到相关的设计.财税.金融.政策等方面的延伸 ...
- 【转载】DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
- DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
- 如何一步一步用DDD设计一个电商网站(二)—— 项目架构
阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...
- DDD CQRS架构和传统架构的优缺点比较
明天就是大年三十了,今天在家有空,想集中整理一下CQRS架构的特点以及相比传统架构的优缺点分析.先提前祝大家猴年新春快乐.万事如意.身体健康! 最近几年,在DDD的领域,我们经常会看到CQRS架构的概 ...
- 应用程序框架实战十三:DDD分层架构之我见
前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...
- DDD~DDD从零起步架构说明
回到目录 看了传说中的弦哥对园子里.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓),我也来说说我的DDD架构吧,主要是看了微软NlayerApp之后,自己写的一个,以后将会应用到 ...
- 应用程序框架实战十三:DDD分层架构之我见(转)
前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...
随机推荐
- java基础———打印三角形
代码 public static void main(String[] args) { for (int i = 1; i <= 5; i++) { for (int j = 5; j > ...
- KingbaseES 参数 - ignore_char_null_check
KingbaseES 基于PostgreSQL进行了大量的Oracle兼容性开发,为了能同时兼容Oracle 和 PG 的特性,增加参数进行控制.以下介绍 KingbaseES 下特有的参数 igno ...
- KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路
KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路 关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java ...
- Django 目录
1 Python Web开发主流框架 2 Django 简介和版本介绍 3 Django 使用cmd 创建工程 4 Django 创建 APP和目录结构介绍 5 Django 使用VScode 创建工 ...
- Django 创建 APP和目录结构介绍
一.通过pip安装Django 以windows 系统中使用pip命令安装为例 win+r,调出cmd,运行命令:pip install django自动安装PyPi 提供的最新版本.指定版本,可使用 ...
- 第六章:Django 综合篇 - 13:发送邮件
在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件. 所有的功能都在django.core.mail中. ...
- Form表单数据
官方文档地址:https://fastapi.tiangolo.com/zh/tutorial/request-forms/ 接收的不是 JSON,而是表单字段时,要使用 Form 要使用表单,需预先 ...
- 使用KVM的图形化界面安装centos7虚拟机
前提条件 1.宿主机上已经安装KVM的图形化管理软件,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15538881.html 2.宿主机上安装vnc服务器, ...
- python基本数据类型以及基础运算符
今日分享内容 作业讲解 python基本数据类型 与用户交互 格式化输出 基本运算符 多种赋值方式 逻辑运算符 成员运算符 分享内容详细 # 附加练习题(提示:一步步拆解) # 1.想办法打印出jas ...
- NSIS限制程序运行次数和使用日期
#七八年前写着玩的小东西,实际用途不大,但对刚接触nsis的新手来说应该还有一些帮助,包括创建控件,获取系统时间等,与诸位共勉! !system '>blank set/p=MSCF<nu ...