写点什么

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

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

关注

评论

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

头脑风暴:零钱兑换3

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

Kubernetes API Schema

CTO技术共享

开源 签约计划第三季 8月月更

leetcode 239. Sliding Window Maximum 滑动窗口最大值

okokabcd

LeetCode 数据结构与算法 双端队列

每日一R「07」类型系统(一)

Samson

8月月更 ​Rust

【云原生】SpringCloud-Spring Boot Starter使用测试

java李杨勇

Java web SpringCloud Alibaba 签约计划第三季

浅述微服务安全管理机制

阿泽🧸

8月月更 微服务安全

系统入门-Linux系统基础命令

Albert Edison

Linux centos 指令 8月月更

备受资本市场关注的Zebec,正在构建“新DeFi”生态

小哈区块

中台订单分库分表测试总结

转转技术团队

测试方案 后端测试

李斯特:不同流派的产品创新方法及创新误区丨创新工作坊

声网

灵感宝盒 RTE NG-Lab

Flutter 动画组件那么多,记不住不会用怎么办?我都给你整理好了,收藏吧!

岛上码农

flutter 前端 安卓 移动端开发 8月月更

“新DeFi”生态的构建,流支付协议Zebec或厚积薄发

BlockChain先知

架构实战营毕业总结

Geek_53787a

转转价格系统DDD实践

转转技术团队

领域驱动设计 DDD

开源中国专访 TJ:开源许可证,欢迎来到云时代

tapdata

Tapdata 开源社区

Hi,我是ChunJun,一个有趣好用的开源项目

袋鼠云数栈

多次拿下移动集团技术发明大奖,TA是怎么做到的?

鲸品堂

AI 资源

开源生态研究与实践| ChinaOSC

CCF开源发展委员会

备受资本市场关注的Zebec,正在构建“新DeFi”生态

西柚子

中国开源先锋人物志 | ChinaOSC

CCF开源发展委员会

RocketMQ高性能设计之动态缩扩容和消息实时投递

急需上岸的小谢

8月月更

【云原生】SpringCloud是什么?

java李杨勇

Java spring-boot 签约计划第三季

Redis 潜在问题

武师叔

8月月更

ICMPv6协议详解

穿过生命散发芬芳

8月月更 ICMPv6

基于JavaSpringMVC+vue实现协同过滤电影推荐系统详细设计

java李杨勇

Java spring Vue 3 签约计划第三季 协同过滤

【云原生】微服务SpringCloud-eureka(server)集群搭建

java李杨勇

Eureka spring-cloud 签约计划第三季

C++继承中的对象模型与继承中构造和析构顺序

CtrlX

c c++ 面向对象 继承 8月月更

Kubernetes list和watch详解

CTO技术共享

开源 签约计划第三季 8月月更

Kubernetes Cilium Cluster Mesh

CTO技术共享

开源 签约计划第三季 8月月更

开源知识库与SaaS解决方案的区别

Geek_da0866

超云

Kent Yao

超云 Supercloud

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