写点什么

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

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

关注

评论

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

打开算法黑箱之谜 !“可解释机器学习”在金融领域的应用

索信达控股

大数据 AI 算法 金融科技 模型开发

论“内卷”

容光

浅析 PHP 的「垃圾回收」机制

悟空聊架构

php 垃圾回收 6月日更 引用计数

PostgreSQL 的审计和权限控制系统

GrowingIO技术专栏

postgresql

腾讯官方出品,国内首款免费VPN,ios+安卓,永久免费不限速

程序员生活志

已删除的回收站文件恢复方法

淋雨

实用工具 数据恢复 EasyRecovery

【布道 API】REST 从来都不是基于 CRUD

devpoint

Rest crud 6月日更

公安警情大数据情报研判分析系统开发,可视化大屏开发

如何利用GitHub Pages快速构建免费网站?

程序员生活志

​浅谈云上攻防之元数据服务带来的安全挑战

腾讯安全云鼎实验室

安全攻防 网络安全 #腾讯云

MySQL基础之七:内连接详解

打工人!

myslq 6月日更

记录response.Body.Close()引发的goroutine泄漏

王博

区块链发展迎来新机遇

CECBC

Bzz云算力挖矿APP开发,Bzz矿机分币系统

理解rust函数中的生命周期

wzx

rust 生命周期

SkipGram

Qien Z.

nlp 6月日更 SkipGram negative sampling CBOW

华为鸿蒙 OS 正式发布,未来是否会对安卓市场造成“威胁”?| 话题

xcbeyond

鸿蒙 话题讨论 HarmonyOS 6月日更

入夏以来,nginx中国首场技术盛宴!nginx社区线下沙龙-北京专场圆满举办

爱极客侠

赋能实体成区块链重中之重 供应链、溯源和数据等迎来政策红利期

CECBC

浪潮云洲工业互联网平台市场地位、发展能力连续两年蝉联双料第一

云计算

【源码系列】Spring Boot 条件配置

Alex🐒

spring 源码 StringBoot

数组的 sort() 方法详解

编程三昧

JavaScript 编程 算法 大前端 数组

优化算法

容光

20 岁发表 SCI 的学霸,梦想用算法改变世界

阿里云CloudImagine

学习 阿里云 算法 计算机视觉 音视频

入职阿里定级P7,2021年最新最全180道高级岗面试题及答案

Java架构师迁哥

请问我要做全栈程序员么?听说更厉害更赚钱?

程序员鱼皮

Java c++ Python 大前端 全栈

API 中签名的使用

架构精进之路

签名 6月日更

爱奇艺于首届MediaAIAC与首届高新视频创新应用大赛斩获三项权威大奖,技术实践领跑行业创新

爱奇艺技术产品团队

大赛 视频修复 MediaAIAC

【源码系列】Spring Boot 自动装配

Alex🐒

spring 源码 Spring Boot

上架Steam一周的付费游戏,开源了!其实你能“薅”的不止一只羊

程序员生活志

【源码系列】Spring Bean 循环依赖

Alex🐒

spring 源码 Spring Framework

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