领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

news/2024/9/21 6:23:28/

博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构
技术范围: 目前专注java体系,以及golang、.Net、软件架构、DDD、微服务、redis、nginx、tomcat、mysql、oracle等
业务范围: 从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些技术积累,欢迎交流合作 持续关注Yuperman ***

领域驱动DDD三种架构-分层架构、六边形架构、洋葱架构

本文介绍DDD的三种主要实现架构
1.分层架构
2.六边形架构
3.洋葱架构

据了解互联网很多大厂都在应用实践DDD,同时很多银行保险等行业也在积极深入应用,DDD也非常适合我所在的医疗行业,也在部分项目中进行了应用。在早期的项目中应用分层架构较多,随着理解深入和DDD演进,逐渐应用洋葱架构

领域驱动DDD适合应用场景包括:

(1)业务应用系统:当项目涉及多个业务领域,且业务逻辑复杂时,采用DDD能够提高系统的可维护性、可扩展性和灵活性。

(2)团队协作:在大型项目中,DDD有助于明确各团队的职责范围,提高团队之间的沟通协作效率。

(3)业务变化频繁的项目:DDD能够帮助系统快速响应业务变化,降低因业务变动导致的开发成本。


文章目录

优势与不足

优势:

(1)提高可维护性:通过将复杂的业务场景划分为简单的领域,有利于代码的阅读和维护。

(2)提高可扩展性:领域之间的解耦降低了系统间的耦合度,有利于未来的功能扩展和新技术引入。

(3)提高灵活性:基于领域模型的设计使得系统能够更快地响应业务变化,提高适应性。

(4)促进团队沟通:通过清晰地定义领域边界,有助于团队之间的交流和协作。

不足:
(1)学习成本较高:掌握DDD需要一定的领域知识和编程经验,对于初学者来说,学习成本较高。

(2)过度设计:在实际项目中,过度关注领域划分可能导致系统设计过于复杂,反而降低开发效率。

(3)领域建模挑战:对于某些复杂业务场景,领域建模可能存在一定的困难,需要开发者具备较高的业务理解和建模能力。

一、分层架构

2003年,Eric Evans出版了他的标志性著作《领域驱动设计:软件核心复杂性应对之道》。从此,DDD的概念被人熟悉,以及基于DDD的一系列架构演变开始出现。

在这里插入图片描述

分层架构,每一层,只与自己下一层发生耦合,类似于网络的7层或TCP/IP的4层模型架构,每一层各司其职,并且只关心向下一层的实现,而不会出现各层耦合。

DDD分层架构中包含四层:从上到下分别是用户接口层,应用层,领域层和基础层。


二、六边形架构

2005年Alistair Cockburn提出了六边形架构,在这个架构中,将应用分为内六边形和外六边形两层,内六边形实现应用的核心业务逻辑。外六边形完成外部应用,基础资源等的交互和访问,对于与不同的外部系统交互,由外六边形的适配器负责协议转换,保证内六边形业务逻辑的干净。
这种架构也是典型的分层架构,和DDD分层架构一样,都体现了高内聚,低耦合的设计特性。六边形也常作为指导微服务设计的重要架构之一。

在这里插入图片描述

六边形架构又称端口-适配器架构,这个名字更容易理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表应用的业务逻辑,外部代表应用的驱动逻辑、基础设施或其他应用。内部通过端口和外部系统通信,端口代表了一定协议,以API呈现。

一个端口可能对应多个外部系统,不同的外部系统需要使用不同的适配器,适配器负责对协议进行转换。这样就使得应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,并且可以在与实际运行的设备和数据库相隔离的情况下进行开发和测试。

一个端口对应多个适配器,是对一类外部系统的归纳,它体现了对外部的抽象。应用通过端口为外界提供服务,这些端口需要被良好地设计和测试。内部不关心外部如何使用端口,从一开始就要假定外部使用者是可替换的。

三、洋葱架构

洋葱架构是比较新的DDD架构,2008年Jeffrey Palermo已经提出了具有分层思想的洋葱架构,如下图,同心圆代表软件的不同部分,从里向外依次是领域模型,领域服务,应用服务和外层的基础设施和用户终端。

在这里插入图片描述

洋葱架构根据依赖原则,定义了各层的依赖关系,越往里依赖程度越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的情况,这种架构也是典型的分层架构,和DDD分层架构一样,都体现了高内聚,低耦合的设计特性。洋葱架构也常作为指导微服务设计的重要架构之一。

在这里插入图片描述
洋葱架构与六边形架构有着相同的思路,都是通过编写适配器代码将应用核心从对基础设施的关注中解放出来,避免基础设 施代码渗透到应用核心之中。这样应用使用的工具和传达机制都可以轻松地替换,在一定程度上避免技术、工具或者供应商锁定。

洋葱架构分离了基础设施和业务应用,使得我们可以方便地模拟(Mock)基础实施,对业务应用进行测试。企业应用中存在着不止两个层次,洋葱架构还在业务逻辑中加入了一些在领域驱动设计的过程中被识别出来的层次:


四、结语

领域驱动DDD的分层架构、洋葱架构、六边形架构的表现形式稍有不同,对应落地到代码层面的实现层次关系也略有不同,但是核心思想都是一样的,按业务创建领域并进行业务解耦。


http://www.ppmy.cn/news/1528280.html

相关文章

封装一个录音声音振动效果的组件

目标:根据声音的大小实现声音振动特效 实现步骤: 通过 getAudioCapturerMaxAmplitude 观察音频区间封装振动组件,通过声音振幅数据实现振动效果 落地代码: 1)获取振幅数据,出入振动组件 AudioPage.ets …

我从家庭提取的动态IP是独享的吗?

在日常的家庭网络使用中,我们通常会从互联网服务提供商(ISP)那里获得一个动态IP地址。许多用户会产生一个疑问:这个IP地址是我独享的吗?还是其他人也可以使用这个IP?为了回答这个问题,我们需要了…

C语言的文件基础知识

一、文件存在的意义 ① 文件的定义是什么? 文件是以单个名称在计算机上存储的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩…

HarmonyOS开发之自定义构建函数

文章目录 一、Builder装饰器:自定义构建函数1.按引用传递参数2.按值传递参数 一、Builder装饰器:自定义构建函数 UI元素复用机制Builder,该自定义组件内部UI结构固定,仅与使用方进行数据传递,开发者可以将重复使用的U…

深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!

代理模式(Proxy Pattern)是一种结构型设计模式,它提供了对象的替身,即代理对象来控制对实际对象的访问。通过代理对象,可以在不修改目标对象的情况下,扩展或控制其功能。例如,代理模式可以用于延…

网络安全与国家安全的关系

网络安全与国家安全密切相关,网络安全是国家安全的重要组成部分。网络安全不仅关系到国家的政治安全、经济安全、文化安全、社会安全、军事安全等领域,还直接影响着国家的总体安全观。在信息化时代,网络空间已成为继陆、海、空、天之后的第五…

无人机视角应急救援(人)数据集

无人机视角应急救援(人),两个数据集 part1,使用DJI Phantom 4A拍摄,分辨率为19201080像素。山区场景,图像中人员姿势分为站立、坐着、躺着、行走、奔跑。共1981张图像6500个不同姿势的标记, par…

Pandas中df常用方法介绍

目录 常用方法df.columnsdf.indexdf.valuesdf.Tdf.sort_index()df.sort_values() 案例 常用方法 df.columns df.columns 是 Pandas 中 DataFrame 对象的一个属性,用于获取 DataFrame 中的列标签(列名)。 基本语法如下: df.col…