从MVC 到DDD 架构

news2024/11/18 19:47:44

目录

一、前言

二、MVC架构

三、DDD架构

四、我为什么会使用DDD?

五、DDD架构分层


一、前言

最近在做一个项目,使用的是DDD架构思,觉得很不错,在此记录下。

二、MVC架构

MVC是一种经典的软件架构模式,主要用于构建用户界面和应用程序逻辑的分离。以下是MVC架构的主要组成部分:

模型(Model):模型表示应用程序的数据和业务逻辑。它负责处理数据的读取、存储、验证和更新,以及定义业务规则和逻辑。
视图(View):视图是用户界面的可视化呈现,负责向用户展示数据和接收用户的输入。它通常根据模型的状态来更新自己,并将用户的操作反馈给控制器。
控制器(Controller):控制器接收来自用户界面的输入,并根据输入调用适当的模型和视图进行处理。它负责协调模型和视图之间的交互,并处理应用程序的逻辑和流程控制。
MVC架构的主要目标是实现关注点分离,将应用程序的数据、逻辑和呈现分离开来,以便更好地管理和维护代码。它提供了一种结构化的方法,使开发人员能够更好地组织代码,并实现可复用、可扩展和可测试的应用程序。

在这篇有具体讲解,MVC 架构思路

三、DDD架构

DDD是一种软件开发方法论,它强调通过对业务领域的深入理解和建模来指导软件设计和开发。DDD的核心是将业务领域的知识和概念融入软件设计中。以下是DDD架构的主要特点:

领域模型(Domain Model):领域模型是对业务领域的概念和规则的抽象建模。它将业务规则和逻辑直接编码到软件中,以便更好地反映实际业务需求。
领域驱动设计(Domain-Driven Design):DDD强调通过与领域专家密切合作,深入理解业务需求,并将这些需求转化为软件设计的核心。它鼓励使用领域语言和概念来进行沟通和设计,以确保软件与业务紧密关联。
聚合根(Aggregate Roots):聚合根是DDD中的重要概念,它是一组相关对象的根,具有事务边界和一致性边界。聚合根通过封装和管理内部对象来维护业务规则和完整性。
领域服务(Domain Services):领域服务是一些无状态的操作,用于执行与业务关联的操作。它们通常在领域模型之外,提供一些跨领域对象的操作和协调。
DDD的主要目标是通过深入理解业务领域和建立有效的领域模型,来解决复杂业务问题。它强调将业务逻辑和行为嵌入到软件设计中,以实现更好的可维护性、可扩展性和可测试性。

四、我为什么会使用DDD?

首先我们先明白MVC的特点——简单、容易、好理解;但也正因为简单的分层逻辑,在适配较复杂的场景并且需要长周期的维护时,代码的迭代成本就会越来越高。

当接触过较大型且已经长期维护项目的 MVC 架构,会发现这里的 DAO、PO、VO 对象,在 Service 层相互调用。那么长期开发后,就导致了各个 PO 里的属性字段数量都被撑的特别大。就像一种“裤子乱穿”的现象,第一个人看到该类时,发现这个刚好是我自己想用的,直接拿走使用,调方法;第二个人看到了,发现也是我需要的,但缺少了某些功能或某些字段,就自己加上,然后调方法使用,第三个人……等等,这个方法就像“公共裤子一样,被许多人使用,并且裤子越来越大,越来越臃肿,产生的调用也紊乱,如下图所示。

而 DDD 架构首先以解决此类问题为主,DDD 架构的模型分层,则是以人为视角,一个人就是一个领域,一个领域内包括他所需的衣服、裤子、袜子、鞋子。虽然刚开始有点浪费空间,但随着软件的长周期发展,后续的维护成本就会降低;将各个属于自己领域范围内的行为和逻辑封装到自己的领域包下处理。这也是 DDD 架构设计的精髓之一。它希望在分治层面合理切割问题空间为更小规模的若干子问题,而问题越小就容易被理解和处理,做到高内聚低耦合。这也是康威定律所提到的,解决复杂场景的设计主要分为:分治、抽象和知识。

五、DDD架构分层

如下是 DDD 架构的一种分层结构,也可以有其他种方式。

接口定义 api:因为微服务中引用的 RPC 需要对外提供接口的描述信息,也就是调用方在使用的时候,需要引入 Jar 包,让调用方好能依赖接口的定义做代理。

应用封装 app:这是应用启动和配置的一层,如一些 aop 切面或者 config 配置,或者将 mapper 等.xml 文件,以及打包镜像(yml、yaml)都是在这一层处理。你可以把它理解为专门为了启动服务而存在的。

领域封装 domain:领域模型服务,是一个非常重要的模块。无论怎么做DDD的分层架构,domain 都是肯定存在的。在一层中会有一个个细分的领域服务,在每个服务包中会有【模型、仓库、服务】这样3部分,例如权限领域服务、业务领域服务、支付领域服务等(里面包括model、repository、service等)。

model 模型对象里面存放了, aggreate:聚合对象,实体对象、值对象的协同组织,就是聚合对象。entity:实体对象,也就是Java实体类。valobj:值对象,通过对象属性值来识别的对象,也就是VO。

repository 仓储服务;从数据库等数据源中获取数据,传递的对象可以是聚合对象、实体对象,也就是对应MVC 的数据层接口(IxxxRepository)。

 service 服务,一个业务对应一个service,把一些重核心业务放到 service 里实现。

仓储服务 infrastructure:基础层依赖于 domain 领域层,因为在 domain 层定义了仓储接口需要在基础层实现。

里面存放了Dao、po、Repository(实现IxxxRepository接口)等。

领域封装 trigger:触发器层,一般也被叫做 adapter 适配器层。用于提供接口实现、消息接收、任务执行等(例如http、mq、job、监听器)。所以对于这样的操作,所以也叫做触发器层。

类型定义 types:通用类型定义层,在我们的系统开发中,会有很多类型的定义,包括;基本的 Response、Constants、Util 和枚举。它会被其他的层进行引用使用。

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

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

相关文章

GEE:将分类特征和标签提取到样本点,并以(csv/shp格式)下载到本地

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine(GEE)平台上,下载用于机器学习分类或者回归的样本点数据,样本点数据携带了分类特征和标签信息,可以以csv格式或者SHP格式。 结果如下图所示, 文章目录 一、核心函数1.1 采样1.2 下载函数二、代码链接三、完整代码…

Go-js,css,html压缩和混淆(可直接使用)

前提条件: 本地安装nodejs环境然后配置全局环境变量。 运行以下命令安装uglify压缩工具 npm install uglify-js -g 测试是否安装成功 uglifyjs -v 使用方式: 根据不同的操作系统取对应的压缩工具,然后将压缩工具放到项目根目录下,然后执行即可 工具文件: https://gitee.com…

GPT提示词分享 —— 口播脚本

可用于撰写视频、直播、播客、分镜头和其他口语内容的脚本。 提示词👇 请以人的口吻,采用缩略语、成语、过渡短语、感叹词、悬垂修饰语和口语化语言,避免重复短语和不自然的句子结构,撰写一篇关于 [主题] 的文章。 GPT3.5&#…

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为:An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者:Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

喜讯!聚铭网络荣获《日志分类方法及系统》发明专利

近日,聚铭网络又喜获一项殊荣,其申报的《日志分类方法及系统》发明专利成功获得国家知识产权局的授权,正式荣获国家发明专利证书。 在信息化时代,网络安全问题日益凸显,日志分析作为保障网络安全的重要手段&#xff…

【机器学习之旅】概念启程、步骤前行、分类掌握与实践落地

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

【旅游景点项目日记 | 第一篇】项目服务架构、数据库表设计

Gitee仓库地址:travel-server:景点旅游项目服务端 文章目录 1.项目服务架构2.数据库设计2.1用户服务—travel_ums2.1.1 ums_user—用户表 2.2景点服务—travel_ams2.2.1 ams_attraction—景点表1.2.2 ams_resource_type—资源类型表 2.3票务服务—trabel…

人工智能的决策树介绍

决策树模型 决策树基于“树”结构进行决策 每个“内部结点”对应于某个属性上的“测试”每个分支节点对应于该测试的一种可能结果(即属性的某个取值)每个“叶结点”对应于一个“预测结果” 学习过程:通过对训练样本的分析来确定“划分属性”…

如何在jupyter使用新建的虚拟环境以及改变jupyter启动文件路径。

对于刚刚使用jupyter的新手来说,经常不知道如何在其中使用新建的虚拟环境内核,同时,对于默认安装的jupyter,使用jupyter notebook命令启动 jupyter 以后往往默认是C盘的启动路径,如下图所示,这篇教程将告诉…

vector类(一)

文章目录 vector介绍和使用1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector增删查改2.5 vector迭代器失效问题 3.vector 在OJ中的使用 vector介绍和使用 1.vector的介绍 vector是表示 可变大小数组的 序列容器。 就…

Matlab|【免费】面向多微网网络结构规划的大规模二进制矩阵优化算法

目录 1 主要内容 节点故障网络拓扑变化示意 约束条件 目标函数 3 结果一览 4 下载链接 1 主要内容 当前电力系统中微电网逐步成为发展的主力军,微网中包括分布式电源和负荷,单一的微电网是和外部电源进行连接,即保证用电的效益性&#…

手机短信验证码自动转发到服务器

今天写一个自动化处理程序,需要验证码登录,怎么样把手机收到的短信自动转发到服务器接口呢? 利用ios手机快捷指令的功能 打开快捷指令点击中间自动化点击右上角号选择信息信息包含选取,输入验证码选择立即执行点击下一步按下图配…

SpringBoot集成WebSocket实现简单的多人聊天室

上代码—gitee下载地址: https://gitee.com/bestwater/Spring-websocket.git下载代码,连上数据库执行SQL,就可以运行,最终效果

17、GateWay和Sentinel继承实现服务限流

注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、需求说明 cloudalibaba-sentinel-gateway9528 保护 cloudalibaba-provider-payment9001 2、启动nacos服务器8848 startup.cmd -m standalone 3、启动sentinel服务器8080 java -jar sentinel-dash…

PPT没保存怎么恢复?3个方法(更新版)!

“我刚做完一个PPT,正准备保存的时候电脑没电自动关机了,打开电脑后才发现我的PPT没保存。这可怎么办?还有机会恢复吗?” 在日常办公和学习中,PowerPoint是制作演示文稿的重要工具。我们会在各种场景下使用它。但有时候…

【办公类-21-11】 20240327三级育婴师 多个二级文件夹的docx合并成docx有页码,转PDF

背景展示:有页码的操作题 背景需求: 实操课终于全部结束了,把考试内容(docx)都写好了 【办公类-21-10】三级育婴师 视频转文字docx(等线小五单倍行距),批量改成“宋体小四、1.5倍行…

汇编语言学习记录 01

目录 VScode配置调试环境 Debug的主要命令 简单写个Hello World VScode配置调试环境 没有IDE真的蛮难受的 安装插件TASM/MASM 右键扩展设置,选择Assembler:MASM 右键调试即可开始 Debug的主要命令 R-查看和修改寄存器 D-查看内存单元 E-修改内…

Remote Desktop Manager for Mac:远程桌面管理软件

Remote Desktop Manager for Mac,是远程桌面管理的理想之选。它集成了多种远程连接技术,无论是SSH、RDP还是VNC,都能轻松应对,让您随时随地安全访问远程服务器和工作站。 软件下载:Remote Desktop Manager for Mac下载…

Linux虚拟机环境搭建spark

Linux环境搭建Spark分为两个版本,分别是Scala版本和Python版本。 一、 安装Pyspark 本环境以 Python 环境为例。 1、下载spark 下载网址:https://archive.apache.org/dist/spark 下载安装包:根据自己环境选择合适版本,本环境…

【JSON2WEB】11 基于 Amis 角色功能权限设置页面

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…