写点什么

在洋葱(Onion)架构中实现领域驱动设计

  • 2014-11-02
  • 本文字数:1008 字

    阅读完需:约 3 分钟

Wade Waldron 是一位来自于 BoldRadius 的资深软件开发者,他在一次演讲中表示,他在几年前开始结合使用领域驱动设计(DDD)与洋葱架构,他的代码质量从此得到了极大的提高。一开始他仅仅使用了DDD,但随着结合使用洋葱架构,他发现他的代码更加易读易懂了,维护的难度也降低了许多。

洋葱架构有时也被称为端口和适配器(Ports and Adapters)架构,或者是六边形(Hexagonal)架构。不过Wade 认为,后者应该是洋葱架构的一个超集。

核心(Core **)层是与领域或技术无关的基础构件块,它包含了一些通用的构件块,例如 list、case 类或 Actor 等等。核心层不包含任何技术层面的概念,例如 REST 或数据库等等。
领域(Domain**)层
是定义业务逻辑的地方,每个类的方法都是按照领域通用语言中的概念进行命名的。对领域层的控制是通过 API 层进行操作的,而所有的业务逻辑都归属于领域层。这种方式保证了应用程序的可移植性,在不丢失任何业务逻辑的情况下替换掉整个技术实现。
API**** 层是领域层的入口,它使用领域中的术语和对象。Wade 提到:API 层应该仅仅向外界暴露不可变的对象,以避免开发者通过暴露的对象获得对底层领域的访问,并任意修改领域行为。Wade 通常会从 API 层开始编码工作,每个方法就是一个骨架,并且对应一个高层次的功能性测试。随后添加代码逻辑以使该测试通过,以此驱动领域层的编码实现。
基础架构(Infrastructure)层是最外部的一层,它包含了对接各种技术的适配器,例如数据库、用户界面以及外部服务。它能够访问所有处于内部的层次,但多数操作是通过 API 层进行的。但也有一种例外情况的存在 ,就是负责实现领域层中所定义的某些接口(译注:例如各种 Repository 的接口)。

洋葱架构中的一个重要概念是依赖,外部的层能够访问内部的层,而内部的层则对外部的层一无所知。

验证某种设计的常见方式是对各种情景进行测试,例如在必须使用一种新的数据库或用户界面技术时,该设计的表现如何。Wade 认为,如果认真地遵循了 DDD 和洋葱架构的原理,那么是完全能够处理好这种变更的。

Alistair Cockburn 在 2005 年时演示了六边形架构,作为对传统分层架构、耦合与牵连等问题的解决方案。

Russ Miles 去年在一次演讲中介绍了他构思的 Life Preserver 设计,这是一种基于六边形架构的设计。

除了以上两者,还存在着第三种变体,就是 Robert C. Martin 在去年谈到干净架构(Clean Architecture)。

查看英文原文: Domain-Driven Design with Onion Architecture

2014-11-02 05:0011728
用户头像

发布了 428 篇内容, 共 186.3 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

[译] D8 类库脱糖

Antway

6月日更

为什么switch的case没有break不行

叫我阿柒啊

Switch case break

计算机网络的 89 个核心概念

苹果看辽宁体育

后端 计算机网络 网络

HarmonyOS学习路之开发篇——公共事件与通知(一)

爱吃土豆丝的打工人

Java HarmonyOS 鸿蒙操作系统

一步步设计版本控制系统

Java·课代表

git 版本控制 版本管理

APP 开发技术如何进行选型 ?

程序员海军

大前端 App 技术选型 APP开发

数据结构——顺序表

若尘

数据结构 6月日更

冰泉奶茶香牙膏好不好?奶茶控的宝藏牙膏就是它

Geek_50a546

AI论文解读:基于Transformer的多目标跟踪方法TrackFormer

华为云开发者联盟

预测 Transformer 多目标跟踪 TrackFormer 跟踪目标

容器化 | 在 Kubernetes 上部署 RadonDB MySQL 集群

RadonDB

MySQL Kubernetes 容器

可视化搭建的一些思考和实践

白玉兰开源

12种mysql常见错误总结 +分析示例

李阿柯

MySQL 面试 常见问题

基于 Web 引擎扩展技术的 RTC 混合开发框架实践

白玉兰开源

大前端

联想服务斩获两项智能运维大奖 助力企业业务创新与数字化转型

科技大数据

AI如何赋能软硬件产品创新?百度大脑开放日西安站解密

百度大脑

AI 百度大脑 开放日 EdgeBoard

使用SpringCloud的openFeign组件踩坑纪实

小江

dubbo Feign spring-cloud

代码管理工具:Git和SVN

正向成长

git svn

带你认识9种常用卷积神经网络

华为云开发者联盟

神经网络 深度学习 卷积神经网络 图像 卷积

回忆录 | 那些你不能错过的CTF夏令营往届历程,2021精彩继续……

郑州埃文科技

30分钟接入SDK 融云是如何让开发者做到开箱即用的?

融云 RongCloud

使用 Scala 宏解决对象转换

GrowingIO技术专栏

scala protobuf 元编程 macro

EasyRecovery——一款专业的数据恢复软件

淋雨

文件恢复 Easyrecovery破解 免费恢复软件 硬盘数据恢复

深度解读MRS IoTDB时序数据库的整体架构设计与实现

华为云开发者联盟

大数据 架构 时序数据库 FusionInsight MRS MRS IoTDB

掌门教育自研APM实际分享

白玉兰开源

Linux之nl命令

入门小站

Linux

在线sitemap链接提取工具

入门小站

工具

JavaScript学习(十一)---RegExp对象

空城机

JavaScript 大前端 6月日更

Rust从0到1-自动化测试-测试组织

rust 单元测试 集成测试 自动化测试

全网最详细XSS跨站脚本攻击,不是过来打死我!!

网络安全学海

程序员 网络安全 信息安全 XSS 漏洞修复

面试官:你知道怎么求素数吗?

华为云开发者联盟

面试 开发者 开发 代码 素数

支持低代码开发和远程真机,DevEco Studio 2.2 Beta1来啦

科技汇

在洋葱(Onion)架构中实现领域驱动设计_架构_Jan Stenberg_InfoQ精选文章