分层架构是一种架构风格,本质是避免耦合,使边界清晰.
六边形架构 遵循了分层架构的所有约束与特性,其实使用 端口与适配器这个名字更加合适.因为六边形架构的 边数没有意义.
六边形架构能够充分地区分 领域模型与 输入输出设备之间的界限.
1. 六边形架构(端口与适配器)
- 一种具有对称性特征的架构风格
- 在这种架构中不同的客户通过”平等”的方式与系统交互
- 新客户的加入,只需要添加一个新的适配器将客户输入转化成能被系统 API 所理解的参数就行了
- 系统输出(图形界面、持久化和消息等)都有一个新建的适配器负责完成相应的转化功能.
2. 六边形架构的概念
实体 Entity
领域对象的一个 Snapshot. 他不知道自身的存储位置.
存储器 Repositories
是获取实体及创建和更改实体的 interface
.它们保存一系列方法,用来与数据源通信并返回单个实体或实体列表
交互器 Interactors
是用来编排和执行域动作(domain action),的类——可以考虑服务对象或用例对象.它们实现复杂的业务规则和针对特定域动作的验证逻辑.
数据源 Datasource
是针对不同 Repository 实现的适配器(Adaptor). 数据源可能是 SQL 数据库的适配器弹性搜索适配器,REST API,CSV 文件, 或者 Hash表 之类的简单适配器. 数据源实现在 Repository 上定义的方法, 并存储获取和推送数据的实现.
层: 领域层
领域模型包含了所有的应用逻辑与规则.
领域层中不会直接引用技术实现(细节),例如 HTTP 上下文或数据库调用,这样就能够确保在技术方面的改动不会影响到领域层面.
层: 端口层
负责接收与用例
相关的所有请求,这些请求负责在领域层中协调工作
端口层在端口内部作为领域层的边界,在端口外部则扮演了外部实体的角色.
层: 适配器层
这一层的技术实现负责以某种格式接收输入,及产生输出.
在适配器层不存在领域逻辑,它的唯一职责就是在外部世界与领域层之间进行技术性的转换.
3. 六边形架构的优点
- 可以轻易的开发用于测试的适配器。
- 应用程序和领域模型可以在没有客户和存储机制的条件下进行设计开发
- 任何测试客户都可以在用户解密还未完成之前进行开发
- 选择持久化机制之前,可以在测试中采用内存资源库来模拟持久化
- 如此可以在核心领域上进行持续开发,不需要考虑那些支撑性的技术组件
4. 六边形架构的核心思想
关注点分离
- 重心放在领域业务逻辑上, 因为
领域
的业务逻辑相对更加稳定,体现应用的核心价值,应当优先详尽的设计与测试. - 外部的输入驱动逻辑和输出给外部的被驱动逻辑存在可变性,可替换性,同时可以依赖多种不同的具体技术实现,可以在后一个阶段考虑.
- 实际研发过程中还存在输出的外部系统还没有设计与开发好的情况,此时在节奏上也不匹配,可能只有对方的设计文档,甚至更严重的情况下设计文档都没
- 输出的外部系统存在多种不同类型的可能,例如在有些情况下你对接的是 OpenStack,有些情况下对接的是 VMware 。
外部可替换
内部不关心外部如何使用端口, 外部使用者是可替换的这个原则一开始设计的时候就需要遵守。
适配器可以分为2类,“驱动者适配器”和“被驱动者适配器”,也可以称为“输入型适配器”和“输出型适配器”。
输出型适配器从表面上看似乎是内部在使用外部,与外部可替换的原则有冲突,这个问题实际上需要通过“依赖倒置”解决。
依赖倒置
Adapter + Repository
可测试性
- 内六边形中的应用程序应当可以在不依赖外部的情况下自行测试.
- 通过 接口可以 方便的 进行 mock.