智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

在洋葱(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:0011800
用户头像

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

关注

评论

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

30个Kafka常见错误小集合

王知无

架构实战营-模块二作业

俞立夫

架构实战营

复旦大学附属中山医院钱琨:健康医疗大数据时代下的智慧医院建设

星环科技

大数据 医疗 数据能力

百亿级分布式文件系统之元数据设计

焱融科技

云计算 技术 分布式 高性能 文件存储

“遇见”未来“编程”语言,面向组件编程,送给在校学生

清风

Java 小程序 毕业设计

Hadoop安装与常用操作命令

Mike

趣说开源|学生如何参与开源社区?

SphereEx

数据库 开源

Python入门:ChainMap 有效管理多个上下文

华为云开发者联盟

Python 字典 上下文 映射 ChainMap

为什么区块链是互联网的100倍?

CECBC

如何将知识引入机器学习模型提升泛化能力?

华为云开发者联盟

机器学习 算法 数据 模型 物理学

基于java springboot体育馆预约微信小程序源码(毕设)设计开发

清风

Java 小程序 源码 毕业设计

MySQL 系列教程之(五)DDL 操作:建库建表

若尘

MySQL 数据库 8月日更

2021,编程语言如何选择?

程序员鱼皮

Java c++ Python JavaScript Go 语言

技术加持、服务先行:北鲲云超算平台助力生命科学领域研究与发展

北鲲云

Go语言:如何通过Go来更好的开发并发程序 ?

微客鸟窝

Go 语言

MySQL安全加固方法分享

Simon

MySQL 数据库 数据安全

Android ANR应用无响应

W🌥

android 8月日更

Compose 中的主题

Changing Lin

8月日更

Hadoop生态系统

Mike

AOC萌新探索:搭建和体验在线AOC环境

华为云开发者联盟

Python 网络 自动化运维 AOC 网络设备

数据加密和BCrypt哈希算法应用 | StartDT Tech Lab 15

奇点云

区块链技术:为什么说波卡能加速区块链行业的发展?

CECBC

能源区块链研究 | 加密行业碳抵消有助于大众接纳比特币吗?

CECBC

走!跟着浪潮云洲去挖矿

云计算

导播上云,把 “虚拟演播厅” 搬到奥运村

阿里云CloudImagine

阿里云 视频处理 视频直播 视频云 云导播

零代码以“王者荣耀”为例解析设计七原则

华为云开发者联盟

软件 设计原则 王者荣耀 单一职责

出现吧,Python Web 菜谱系统的首页,不会前端技术,也能做

梦想橡皮擦

8月日更

【LeetCode】有效的字母异位词Java题解

Albert

算法 LeetCode 8月日更

【SpringBoot技术专题】「JWT技术专区」SpringSecurity整合JWT授权和认证实现

码界西柚

spring security springboot JWT 8月日更

堡垒机、防火墙以及跳板机分别是什么?

行云管家

云计算 运维 防火墙 堡垒机 跳板机

FastApi-15-文件上传-3

Python研究所

FastApi 8月日更

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