写点什么

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

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

关注

评论

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

【一Go到底】第十七天---函数的递归调用

指剑

Go golang 10月月更

【LeetCode】可能的二分法Java题解

Albert

算法 LeetCode 10月月更

推荐|海泰信创浏览器安全解决方案 全面适配安全可靠

电子信息发烧客

年度大促将至,企业如何进行性能压测

阿里巴巴云原生

阿里云 云原生 性能压测 PTS

PriorityQueue 源码解析(三)

知识浅谈

Priority Queue 10月月更

Java基础(八)| 常用API与StringBuilder详解

timerring

Java API 10月月更

Kafka消费者客户端心跳请求

石臻臻的杂货铺

Kafk 10月月更

JS继承有哪些,你能否手写其中一两种呢?

helloworld1024fd

JavaScript

保10万涨薪、保Offer、保大厂,1V1私教服务上线啦!

霍格沃兹测试开发学社

推荐|海泰政务移动办公系统密码应用解决方案 打造移动办公安全

电子信息发烧客

如何掌握“看见数据”的魔力?

博文视点Broadview

5个技巧让CIO最大化提升IT项目投资回报率

雨果

CIO ROI

如何将 SAP Business Application Studio 里开发的 Java 应用部署到 SAP BTP 上

汪子熙

云原生 Cloud 云平台 SAP 10月月更

CentOS下搭建Gitea-自己的git服务器

麦洛

git Gitea

安势清源SCA助力超大规模高科技企业加速开源风险治理

安势信息

开源 腾讯 SCA SBOM 软件供应链安全

Java三大特性(二)—继承

共饮一杯无

Java 继承 10月月更

js函数柯里化-面试手写版

helloworld1024fd

JavaScript

长安链源码分析之网络模块 net-liquid(3)

【荣耀云调试FAQ】一个帐号可以同时使用多部手机吗?

荣耀开发者服务平台

开发者 手机 安卓 荣耀 honor

STM32 HAL库串口同时收发,接收卡死?

矜辰所致

串口 STM32L051 10月月更

欧美开源法案频出,你准备好了吗?

安势信息

出海 #开源 SBOM 软件供应链安全 开源合规

react源码分析:深度理解React.Context

flyzz177

React

redis实现分布式锁(一)

zarmnosaj

10月月更

redis实现分布式锁(二)

zarmnosaj

10月月更

利器| Cypress 强大全新的 Web UI 测试框架应用尝鲜

霍格沃兹测试开发学社

前端必会手写题总结

helloworld1024fd

JavaScript

从源码角度看React-Hydrate原理

flyzz177

React

浙江特殊教育职业学院用上了福昕无障碍技术

科技热闻

Kafka消费组/者协调器的介绍

石臻臻的杂货铺

Kafk 10月月更

哪些数据类岗位不容易失业?

雨果

开发数据 数据科学 数据工程师

企业云安全的6个最佳实践

HummerCloud

10月月更

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