限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

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

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

关注

评论

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

设计千万级学生管理系统的考试试卷存储方案

小虎

架构训练营

纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)

肥晨

11月月更 跳动的爱心 代码爱心 爱心代码

如何在论文中画出漂亮的插图?

Jackpop

千万学生管理系统存储架构设计--redis细化

Johnny

架构实战营

Oracle sql 性能优化(二)

默默的成长

oracle 前端 11月月更

强引用、软引用、弱引用、幻象引用有什么区别和使用场景

共饮一杯无

Java 引用类型 11月月更

教育的本质(57/100)

hackstoic

从URL输入到页面展现到底发生什么?

loveX001

JavaScript

Github已经54k个star的Docker,到底是什么?

Jackpop

猿创征文|点亮JAVA技术之灯(线程篇)

叶秋学长

Java 线程 教学 11月月更

python的类的定义和使用

乔乔

11月月更

小白入门:什么是CURD?

wljslmz

数据库 sql crud 11月月更

Java引用类型(class、interface)用法总结详解

共饮一杯无

Java 11月月更 Java引用类型

夜幕下的湖畔音乐派对,华为音乐之夜为HDC 2022划上“聚”号

最新动态

跟着卷卷龙一起学Camera--信号采样04

卷卷龙

ISP camera 11月月更

跟着卷卷龙一起学Camera--自动驾驶需要几个 camera

卷卷龙

ISP camera 11月月更

Oracle sql 性能优化(一)

默默的成长

oracle 前端 11月月更

诚意满满的前端面试总结

loveX001

JavaScript

极客时间架构训练营模块四作业

李晨

架构

【云原生】Nacos-TaskManager 任务管理的使用

石臻臻的杂货铺

云原生 nacos 11月月更

跟着卷卷龙一起学Camera--信号采样03

卷卷龙

ISP camera 11月月更

作业四:学生考试系统试卷储存方案

许四多

零基础入门网络安全,收藏这篇不迷茫【2022最新】

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。

福大大架构师每日一题

算法 rust 福大大

对象可达性状态流转分析、显式地影响软引用垃圾收集

共饮一杯无

Java 11月月更 引用类型扩展

模块四 -- 作业

李某人

架构训练营 #架构训练营

week4 - 作业 - 设计千万级学生管理系统的考试试卷存储方案

in9

HTML学习笔记(三)

lxmoe

html 前端 学习笔记 11月月更

随机森林-用随机森林回归填补缺失值

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

第九期-模块五

wuli洋

千万级学生管理系统试卷存储方案设计

π

架构实战营

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