写点什么

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

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

关注

评论

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

常用EMC元器件简介——防护器件

元器件秋姐

电子工程师 元器件科普 EMC防护 硬件知识

React-Hooks怎样封装防抖和节流-面试真题

beifeng1996

React

腾讯前端vue面试题合集

bb_xiaxia1998

Vue

SOFARegistry | 聊一聊服务发现的数据一致性

SOFAStack

SOFA SOFARegistry'

iOS不上架怎么安装

雪奈椰子

iOS上架

vue这些原理你都知道吗?(面试版)

bb_xiaxia1998

Vue

高频js手写题之实现数组扁平化、深拷贝、总线模式

helloworld1024fd

JavaScript

Flink 容错恢复 2.0 2022 最新进展

Apache Flink

大数据 flink 实时计算

更稳定!Apache Doris 1.2.1 Release 版本正式发布|版本通告

SelectDB

数据库 大数据 数据分析 bug 版本发布

CSV:简单格式下隐藏的那些坑

华为云开发者联盟

后端 华为云 csv 企业号 1 月 PK 榜

高性能网关基石——OpenResty

C++后台开发

lua nginx openresty 后端开发 高性能网关

前端react面试题(必备)

beifeng1996

React

安卓app上架流程

雪奈椰子

IOS云打包 ios审核

YMatrix 5.0重磅发布,以性能突破引领万物智联下的数据库最佳形态

YMatrix 超融合数据库

Machine Learning 性能提升 超融合数据库 OLTP 场景实践 YMatrix

可观测产品的最佳实践,涵盖端到端的可观测解决方案丨阿里云用户组深圳站

云布道师

阿里云

滴滴前端一面经典手写面试题

helloworld1024fd

JavaScript

前端必会react面试题合集

beifeng1996

React

滴滴前端一面常考手写面试题合集

helloworld1024fd

JavaScript

架构模块3作业-外包学生管理系统架构文档

梁山伯

工赋开发者社区 | “低代码+MOM”,西门子的MES“进化论”

工赋开发者社区

好气啊!为什么我抓不到 baidu 的数据包?

风铃架构日知录

程序员 Java、 java程序员 抓包 数据包

阿里云产品专家陶炳哲:Java应用最佳实验

云布道师

阿里云 Java、

vue面试之Composition-API响应式包装对象原理

bb_xiaxia1998

Vue

Python从0到1丨细说图像增强及运算

华为云开发者联盟

Python 人工智能 华为云 企业号 1 月 PK 榜

3D游戏建模在Maya中加快建模速度的5种技巧

Finovy Cloud

云渲染 建模 maya

App在苹果上架难吗

雪奈椰子

iOS上架 ios审核

面试官:请实现Javascript发布-订阅模式

helloworld1024fd

JavaScript

直播预约 | 微服务x容器开源开发者 Meetup 上海站回顾 & PPT下载

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源

华为云开发者联盟

开源 后端 华为云 企业号 1 月 PK 榜

软件测试/测试开发 | TestNG 与 Junit 对比,测试框架如何选择?

测试人

软件测试 单元测试 JUnit 测试开发 testNG

React-hooks面试考察知识点汇总

beifeng1996

React

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