从MVC 到DDD 架构

目录

一、前言

二、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.mzph.cn/news/775412.shtml

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

相关文章

前端框架的简单介绍

html html-结构 盖房子之前先划三室二厅 (超文本标记语言)(可以实现一切的文本) css css-样式 在房里添家具 (层叠样式单)(化妆在脸上叠加) javascript(js) javascript(js)-交互(行为) 我点击你打开 供显示信息的元…

http模块 url对象的主要属性

在 Node.js 中,URL 对象是一个内置类,用于解析和操作 URL 字符串。URL 对象具有多个属性,这些属性提供了对 URL 不同部分的访问。以下是URL对象的一些主要属性及其含义: (1)href 返回完整的 URL 字符串。…

【爬虫基础】第5讲 AJAX动态页面的数据获取

静态:访问地址栏里的数据就可以获取到想要的数据 动态:访问地址栏里的数据获取不到想要的数据 解决方案:抓包 打开浏览器的开发者工具-network-xhr,找到可以获取到数据的URL访问即可 获取url地址 代码实现: from urllib.request…

aws 入门篇 01.aws学习的方法论

aws入门篇 01.aws学习的方法论 第1章 aws学习的方法论 aws的服务很多,现在应该有100多个服务了,怎么来学习aws呢? 这几年也使用了一些aws的服务,谈谈自己对学习aws的理解。 1.先横向,后纵深 比如说,aws最…

自动驾驶传感器:惯性导航IMU原理

自动驾驶传感器:惯性导航IMU原理 附赠自动驾驶学习资料和量产经验:链接 组合导航里包含了GNSS卫星导航模块与IMU惯性导航模块,前一篇文章写了GNSS模块,本章写IMU惯导,也是本系列最后一篇文章。 1. 惯性测量单元&…

瑞_23种设计模式_观察者模式

文章目录 1 观察者模式(Observer Pattern)1.1 介绍1.2 概述1.3 观察者模式的结构1.4 观察者模式的优缺点1.5 观察者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK中提供的观察者模式实现 ★4.1 Observable类4.2 Obse…

05. 【Android教程】Android 程序签名打包

在上一章,我们创建了自己的 Android 工程,并成功的在模拟器中运行起来。同时提到,工程目录中有一个 bin 目录,运行之后我们可以在此目录下找到我们的 apk。那么不难想到,我们在点“Run”之后,系统会编译我们…

蓝桥杯嵌入式之串口(中断读取)

一、CUbeMX开启串口 1.开启串口USART1 记得手动开起PA9、PA10 2.配置波特率、开启串口中断 3.初始化开启接收中断 定于接收缓存区接收长度(单位字节) 4.在接收事件回调函数中进行操作 sscanf((char*)usart_box,"%4s",temp1); //只取收到的…

以太网链路聚合——增加带宽,解决生成树收敛慢的问题

目录 一.对STP生成树的补充 1.STP接口状态 2.STP生成树的改进 二.网络可靠性 1.单板可靠性 2.设备可靠性 3.链路可靠性 三.链路聚合 1.多条链路聚合增加带宽 2.链路聚合术语 四.链路聚合模式 1.手动模式 2.LASP模式 (1).LASP术语 (2&…

使用itext-core生成PDF

1、添加引用依赖包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency> 2、上代码 package com.student.demo.pdf;impor…

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变&#xff0c;特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变&#xff0c;提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…

逐步学习Go-协程goroutine

参考&#xff1a;逐步学习Go-协程goroutine – FOF编程网 什么是线程&#xff1f; 简单来说线程就是现代操作系统使用CPU的基本单元。线程基本包括了线程ID&#xff0c;程序计数器&#xff0c;寄存器和线程栈。线程共享进程的代码区&#xff0c;数据区和操作系统的资源。 线…

前端学习-01:Windows 安装 npm 教程

一、安装 Node.js Node.js 官方下载地址&#xff1a;点击这里点击绿色的"Download Node.js vxxxx"下载完成后双击开始安装点击 Next 接受协议&#xff0c;点击 Next 点击 Change&#xff0c;自定义安装目录&#xff0c;然后点击 Next 所有默认全部安装即可&#xff…

在 Linux CentOS 中安装 Docker Engine(Dockers 引擎)【图文详解】

官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 操作系统要求 如果我们要在 CentOS 中安装 Docker 引擎&#xff0c;那么 CentOS 操作系统需要是以下版本之一的&#xff0c;且是处于维护的 CentOS 版本&#xff1a; CentOS 7CentOS Stream 8CentOS Str…

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

Zookeeper的系统架构

先看一张图&#xff1a; ZooKeeper 的架构图中我们需要了解和掌握的主要有&#xff1a; 1&#xff1a; ZooKeeper分为服务器端&#xff08;Server&#xff09; 和客户端&#xff08;Client&#xff09;&#xff0c;客户端可以连接到整个ZooKeeper服务的任意服务器上&#xff…

Flink on Kubernetes (flink-operator) 部署Flink

flink on k8s 官网 https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样&#xff0c;有些地方官网不够详细 部署k8s集群 注意&#xff0c;按照默认配置至少有两台wo…

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

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

vue + LogicFlow 实现流程图展示

vue LogicFlow 实现流程图展示 1.背景 部门主要负责低代码平台&#xff0c;配置端负责配置流程图&#xff0c;引擎端负责流程执行&#xff0c;原引擎端只负责流程执行控制以及流程历史列表展示。现在提出个新的要求&#xff0c;认为仅历史记录不直观&#xff0c;需要在展示完…

Overcooked!(并查集区间元素合并优化)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网登录—专业IT笔试面试备考平台_牛客网登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 5 1 1 2 3 1 2 2 2 4 3 1 4 3 2 5 输出 YES YES NO 思路&#xff1a; 根据题意&#xff0c;这…