领域驱动模型设计与微服务架构落地(四)之DDD分层架构设计

news2024/11/18 1:42:16

那么聊完领域模型之后,其实我们会发现,接下来,很多的程序员可能就会直接上代码,因为很多的程序员觉得这个你的战略设计跟我们落地的代码没有关系。哪怕你可能说得天花乱坠,可是做为底层的开发人员,我只关心手头上的功能有没有实现,实现完成之后有没有BUG。

那么我们该如何对于我们的系统进行分层呢?

实际上到了今天为止,大家应该已经见到过很多系统的分层方式,包括我们最常见的三层架构。这也要感谢我们程序员前辈们的努力,让我们已经不用去写那种代码纠缠在一起,整个项目只有一个大的包,各个模块耦合及其严重,扩展性还差的代码了。

很多同学其实在学习架构设计的过程中会有一些误区,会认为MVC架构好像就是三层架构,其实不然,三层架构是一个分层式的软甲架构设计,他对于项目并不挑剔,任何项目都可以使用三层架构,至于好不好用,那是另一说,但是毕竟能用。

而MVC架构则是一个设计模式,也就是说,在我确定了使用分层式架构的三层架构后,我可以根据项目的需求来确定是否使用MVC模式。

不过我们可能只是清楚我们使用的是三层架构,而并不清楚为什么要进行这样的设计,那么为什么要将我们的架构分层呢?其实咱们刚才也已经聊过了。无非就是你如果不进行架构分层,就有可能会导致代码纠缠在一起,整个项目只有一个大的包,各个模块耦合及其严重,扩展性还差。那么我们的架构分层实际上就是为了帮助我们解决这些 痛点。用专业的属于来描述,我们的分层架构设计就是为了帮助我们达到高内聚,低耦合,复用以及扩展性。这四个点。

其实我们计算机领域当中还有很多经典的分层架构,比如TCP/IP模型,就可以是四层架构或者五层架构,而OSI七层模型,不过这些都只是网络分层。

而我们的三层架构,实际上就是表现层、业务逻辑层、数据访问层

首先,我们的表现层,实际上他就是展示给我们用户的层面,对应到项目当中实际上就是你们的servlet或者Controller。

而我们的业务逻辑层,实际上对应到你们的代码层面就是我们的service层,也就是说,他是用来处理我们的业务逻辑的。

而我们的数据访问层,则是直接对我们的数据库进行增删改查操作的。这个也就是我们的Dao层或者Mapper层。

而很多的同学我相信都使用过这样的架构,因为这种架构已经是以及传统CS架构的升级版,它能够将我们的业务逻辑以及数据库访问层面进行隔离。让这个两个非常重要的点能够进行解耦。

1. 四层架构

我们的领域驱动设计为了能够更好贴合业务进行落地,我们也经常会使用分层架构设计,这样做能够更好的凸显领域模型。

传统的三层架构实际上我们能够很明显的发现,我们的数据库将会做为架构起点,我们会从数据库层面开始分析以及设计,但是我们的DDD他的重点其实不在数据库,而是在领域模型,我们会将领域模型做为我们的分析基点,向上进行衍生。进而进行分层设计。

实际上,我们的Eric Evans在《领域驱动设计-软件核心复杂性应对之道》这本书中提出了传统的四层架构模式。

大家可以看到这张图,这个就是我们的四层架构,首先它分为四个层级,分别是

  1. User Interface为用户界面层(或表示层),负责向用户显示信息和解释用户命令。这里指的用户可以是另一个计算机系统,不一定是使用用户界面的人。也就是说,其实大部分的情况,后端向前端展示信息,我们的前端也相当于我们的用户,后端则是暴漏接口。完整内容聚合操作。这里一般代码中会写到装配器,控制器。以及我们的model,不过这里的model是对外暴漏的model。因为我们的实体有可能不会直接对外暴漏,而装配器会对model进行模型转化,包括这里还会有转换过后的模型。

  2. Application为应用层,定义软件要完成的任务,并且指挥表达领域概念的对象来解决问题。这一层所负责的工作对业务来说意义重大,也是与其它系统的应用层进行交互的必要渠道。比如我们的线程调度task,应用服务service等等。但是这里的service不是指的我们的具体的业务逻辑,而是指代的与模型,也就是实体无关的业务逻辑。

  3. Domain为领域层(或模型层),负责表达业务概念,业务状态信息以及业务规则,也就是我们的领域模型。这里特别强调,其实我们的四层架构的业务与我们的实体实际上是放在一起的。我们是通过业务与实体来建立的一个完整的领域模型。一般我们的事件event、模型mpdel,包括模型中的工厂类,领域服务类,对象Vo,实体,Entity,聚合,还有我们的领域服务,比如分页操作,都会放在这里。

  4. 应用层传递消息,为领域层提供持久化机制,为用户界面层绘制屏幕组件,等等。基础设施层还能够通过架构框架来支持四个层次间的交互模式。

分层架构可以简单分为两种,即严格分层架构和松散分层架构。在严格分层架构中,某层只能与位于其直接下方的层发生耦合,而在松散分层架构中,则允许某层与它的任意下方层发生耦合。

传统的四层架构都是限定型松散分层架构,即Infrastructure层的任意上层都可以访问该层(“L”型),而其它层遵守严格分层架构。

并且我们的上层架构可以调用下层架构,而下层架构则不能向上进行调用。

  • Interface ——> application | domain<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最详细的自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试作为软件生命周期中不可缺少的组成部分&#xff0c;对提高软件质量起着重要作用。随着软件测试的发展&#xff0c;自动化测试技术也得到了很大提高。 …

CART算法:决策树的双面剑

一 引言 上一篇文章 决策树算法&#xff1a;ID3与C4.5的对比分析 中介绍了ID3和C4.5两种决策树算法&#xff0c;这两种决策树都只能用于分类问题&#xff0c;而CART&#xff08;classification and regression tree&#xff09;决策树算法它可以处理分类问题&#xff08;Class…

修复数据库中的 “Access Denied: SUPER Privilege Required” 错误

当您使用数据库时&#xff0c;您可能会看到错误消息&#xff1a;“Access denied; you need (at least one of) the SUPER privilege(s) for this operation”。当您的数据库用户没有足够的权限来执行某些操作时&#xff0c;就会发生这种情况。 本文中&#xff0c;我们将查看导…

SQL手工注入漏洞测试(MongoDB数据库)靶场通关攻略

构造数据回显 });return ({title:1,content:2 成功回显1,2&#xff0c;接下来我们开始尝试查询数据库 });return({title:tojson(db),content:2 得到之后我们就可以继续查询他的表名了 });return({title:tojson(db.getCollectionNames()),content:2 最后我们就可以爆出他表里的数…

【EI会议截稿通知】第六届光电科学与材料学术会议 (ICOSM 2024)

第六届光电科学与材料学术会议 (ICOSM 2024) 2024 6th Conference on Optoelectronic Science and Materials 重要通知 重要通知&#xff1a;经组委会商议决定&#xff0c;第六届光电科学与材料学术会议 (ICOSM 2024) 将于2024年9月7日线上召开&#xff0c;具体议程及线上参…

20L水箱植保无人机技术详解

1. 性能与载重 高效作业能力 本款20L水箱植保无人机专为大面积农田作业设计&#xff0c;具备出色的性能与载重能力。其最大载重量可达20kg&#xff0c;不仅轻松搭载20L的水箱及药液&#xff0c;还能根据实际作业需求配置额外的传感器、摄像头等设备&#xff0c;实现多功能集成…

string类题目(上)

string类题目 题目来源&#xff08;Leetcode&#xff09; 题目一&#xff1a;仅仅反转字母 分析 这个反转的特点在于只反转字母&#xff0c;不反转特殊字符。 法一&#xff1a;如果我们让一个正向迭代器指向第一个字符&#xff0c;让一个反向迭代器指向最后一个字符&#xf…

如何使用C4D云渲染服务打开图片渲染器窗口?

C4D以其对第三方渲染器的广泛支持而闻名&#xff0c;能够创造出高质量的视觉作品。这些渲染效果涵盖了逼真的光照和阴影效果、真实的材质质感、精细入微的图像细节&#xff0c;以及令人印象深刻的快速渲染能力。C4D云渲染功能进一步增强了其性能&#xff0c;用户可以通过一个统…

Win10用户必备!三款超实用第三方录屏软件大推荐

大家好&#xff01;今天我要和大家分享一下Win10的录屏操作以及使用体验&#xff0c;并且还会推荐几款好用的录屏工具&#xff0c;希望对大家有所帮助。 Win10录屏操作以及使用体验&#xff1a; Win10自带的录屏主要是为游戏录制而开发的&#xff0c;系统自带不需要额外下载客…

拍立淘API返回值:商品搜索与广告推广的完美结合

拍立淘&#xff08;一种基于图像搜索的购物功能&#xff0c;常见于淘宝等电商平台&#xff09;的API&#xff08;应用程序接口&#xff09;返回值在商品搜索与广告推广的结合中扮演了关键角色。这种结合不仅提升了用户体验&#xff0c;还通过精准推荐和广告展示增加了商家的曝光…

DDIA 分布式数据的分区与复制 - 基于 Redis、Kafka、Elasticsearch 的深入分析

引言 本文基于《Designing Data-Intensive Applications》一书&#xff08;设计数据密集型应用&#xff0c;简称 DDIA&#xff09;&#xff0c;深入探讨了 Redis、Kafka 和 Elasticsearch 等常用组件的分区与复制机制。通过这些案例分析&#xff0c;我们可以更好地理解分布式系…

python-竞赛技巧(赛氪OJ)

[题目描述] 在 ACM 竞赛中&#xff0c;当遇到有两个队伍&#xff08;人&#xff09; 解出相同的题目数量的时候&#xff0c;我们需要通过他们解决问题的总时间进行排序。 一共有 N 条时间被以时( Hours )&#xff0c; 分( Minutes )&#xff0c;秒( Seconds )的形式记录。 你必…

​北斗终端:无人驾驶领域的导航新星

一、北斗终端在无人驾驶领域的应用 北斗终端&#xff0c;作为我国自主研发的北斗卫星导航系统的重要组成部分&#xff0c;其在无人驾驶领域中的应用正逐步显现其独特魅力。北斗系统的高精度、高可靠性和良好的抗干扰性能&#xff0c;为无人驾驶车辆提供了精确的定位和导航服务…

生信圆桌x 生信人论坛:生物信息学爱好者的交流与学习社区

介绍 生信人论坛是一个专为生物信息学&#xff08;生信&#xff09;领域的研究人员、学生和爱好者创建的在线社区。在这里&#xff0c;用户可以分享他们的研究经验、讨论最新的生信技术和工具&#xff0c;并向同行请教各种生信分析问题。生信人论坛不仅是一个知识分享的平台&a…

云朵备份:微信的云备份工具

什么是 云朵备份 &#xff1f; 云朵备份 是一个微信云备份程序&#xff0c;使用云朵备份可以将微信数据备份到服务器&#xff0c;通过浏览器访问数据&#xff0c;你可以像正常使用微信一样浏览数据和搜索数据&#xff08;参考微信网页版&#xff09;&#xff0c;除了不能发消息…

3d网格补洞算法

1.RBF径向基函数法 原文链接:https://blog.csdn.net/feengg/article/details/80849516 算法流程:   1.检测孔洞边界   三角网格由一系列顶点 V V V ,以及这些顶点所构成的三角面片 F F F所组成,由三角面片可以得到网格的边 E E E。通常一条边连接两个三角面片,这种边…

Spring横向渗透

这篇文章给师傅们分享下&#xff0c;前段时间的一个渗透测试的一个项目&#xff0c;开始也是先通过各种的手段和手法利用一些工具啊包括空间引擎等站点对该目标公司进行一个渗透测试。前面找的突破口很少&#xff0c;不太好搞&#xff0c;但是后面找到了spring全家桶的相关漏洞…

基于图神经网络的EEG分类

摘要 图神经网络(GNN)越来越多地用于情绪识别、运动想象以及神经疾病等任务的脑电信号(EEG)分类。人们已经提出了一系列方法来设计基于GNN的分类器。因此&#xff0c;有必要对这些方法进行系统回顾和分类。本文对已发表的文献进行了详尽地检索&#xff0c;并总结了几种用于比较…

IT统一运维平台案例

功能模块图 运维平台的架构图&#xff0c;划分为三个主要部分&#xff1a;统一运维门户、报告与决策中心、运维服务调度中心。以下是对每个部分的解析&#xff1a; 1. 统一运维门户 这是用户的统一入口&#xff0c;提供了一系列运维相关的服务和功能&#xff0c;包括&#xf…

艾体宝干货丨Redis与MongoDB的区别

Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务器&#xff09;和 MongoDB 是两类知名的 NoSQL数据库&#xff0c;其以非结构化的方式存储数据。与传统关系数据库使用表格、行和列来组织数据不同&#xff0c;NoSQL数据库采用了不同的数据存储模型。Redis是…