写点什么

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

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

关注

评论

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

最新Idea 2020.1 二种方法激活教程

公众号:V5codings

intellij-idea

NumPy 运算规则总结

张利东

Python

C语言数据类型

C语言技术网-码农有道

VSCode最强助攻

页面仔小杨

编程 vscode

ELK 日志收集简易教程

meng

elasticsearch Logstash Kibana ELK Filebeat

游戏开发通用技术和工具

波波

编程 游戏开发 H5游戏

使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (二)为什么要写单元测试

编程道与术

编程 编程语言 TDD 代码审查 单元测试

2020年程序猿必读10本好书推荐

ABC实验室

学习 2020 程序员 好书推荐

Kafka系列第5篇:一文读懂消费者背后的那点"猫腻"

z小赵

大数据 kafak 实时计算

C语言程序的基本结构

C语言技术网-码农有道

C/C++

docker安装mysql5.7并挂载目录到本地

桥哥技术之路

Docker

打造个人商业模式第一步

一尘观世界

副业赚钱 提升认知 思维方式 商业模式 认识自己

我的编程之路-2(首秀)

顿晓

方法 沟通 新项目

freecplus框架,Linux平台下C/C++程序员提高开发效率的利器

C语言技术网-码农有道

从全国首起暗网案件告破说起——暗网,超乎你想象

石君

网络安全 暗网 洋葱网络

嵌套文件夹复制实现

Howe

Java 文件复制

Grafana+Prometheus(InfluxDB)+Jmeter使用Nginx代理搭建可视化性能测试监控平台

软测小生

Grafana Prometheus Influxdb Jmeter 性能测试

面对压力的战略和战术

山楂大卷

管理 精神力 逻辑思维 压力 工作思路

Flutter Andorid真机或打包APK杂症记录

北风烈

flutter 打包APK

快来体验 JetBrains Space EAP 版本

刘培培

DevOps JetBrains Space

5G来临,我们该如何打造自己的家庭数据中心基础篇

ABC实验室

5G 数字资产 家庭数据中心

听保洁老大爷讲Java的垃圾回收

侯树成

JVM

告别手写,一键生成 Helm Chart README

郭旭东

Kubernetes Helm

自助设备系列——上下游

孙苏勇

产品 行业资讯 智能设备

当我们说文本编辑器时,到底在说什么

付济

写作平台 InfoQ markdown

高仿瑞幸小程序 03 创建轮播图

曾伟@喵先森

小程序 微信小程序 大前端 移动

分析Kubernetes技术体系的层级,慎用比较前沿的技术

韩超

给程序员的错误找个台阶

曲水流觞TechRill

我在极客时间学习的三个月

石乐

我的工作原则与思考

梁帅

互联网 工作效率 原则

有没有什么上古的程序代码至今依然没被更替?

极客时间

编程 程序员 开发

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