生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

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

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

关注

评论

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

易观千帆 | 2023年3月银行APP月活跃用户规模盘点

易观分析

金融 经济 手机银行

Lex Fridman、Sam Altman对话摘要,从高维度看 ChatGPT 是什么?

B Impact

华为工单宝助力科视光学实现售后服务自动化,提升客户体验和企业效率

YG科技

陈小伟:从ChatGPT谈起,预测5个数据库开发趋势

OceanBase 数据库

数据库 oceanbase

devops如何使用chatgpt提高工作效率

wisonzhu

DevOps

Vue3 内置组件

程序员海军

Vue 3 三周年连更

算法题每日一练---组合总和

知心宝贝

数据结构 算法 前端 后端 三周年连更

一文初探 Go reflect 反射包

陈明勇

Go golang 反射 三周年连更

2023-04-19:给定一个非负数组arr 任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 然后新的arr继续,任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 一直到ar

福大大架构师每日一题

Go 算法 rust

node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。

福大大架构师每日一题

Go

ShareSDK Android SDK API

MobTech袤博科技

华为工单宝:助力制造业数字化转型,通过项目管理实现售后服务自动化和规范化

YG科技

linux性能调优

乌龟哥哥

三周年连更

掌玩科技×OceanBase:HTAP实时数据分析,降低80%存储成本

OceanBase 数据库

数据库 oceanbase

深入剖析Go语言中的Channel:高级特性与注意事项

Jack

Groovy as关键字性能测试

FunTester

Linux内核中的C语言宏:常见用法和最佳实践

Linux内核拾遗

Linux C语言

《嗨,城市猎人》首播,揭秘猎头行业职场真实状态

Geek_2d6073

免费,无需魔法,媲美ChatGPT4

石云升

AI AIGC ChatGPT 三周年连更

金蝶赵燕锡:如何选择大模型?融入To B产品?

B Impact

携程商旅白皮书前瞻:商务旅行,迎来怎样的复苏?

携程商旅

技术 企业管理 数字化 商旅系统 差旅报销

一文读懂物联网 MQTT 协议之基础特性篇

老周聊架构

三周年连更

【Python 实战】Python 采集二手车数据——超详细讲解

BROKEN

三周年连更

阿里云周靖人回答:第一个提出MaaS模式背后的思考路径

B Impact

Django笔记十一之外键查询优化select_related和prefetch_related

Hunter熊

Python django 外键查询优化 select_related prefetch_related

图数据库 NebulaGraph 的 Java 数据解析实践与指导

NebulaGraph

Java 数据库

ETH测试币怎么免费领?Arbitrum ETH水龙头盘点!

加密先生

《一文带你看懂:亿级大表垂直拆分的工程实践》

后台技术汇

数据库 后端 三周年连更

测试需求平台 7- 产品管理服务接口一篇搞定

MegaQi

Python 挑战30天学完Python 三周年连更

华为,找寻科技秋天里的春光

脑极体

通信 算力

【JVM故障问题排查心得】「GC内存诊断」一文教你如何打印及分析JVM的GC日志(实战分析上篇)

洛神灬殇

JVM GC 4月日更 GC日志

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