当前位置: 首页 > news >正文

DDD架构

1.DDD架构的概念:
领域驱动设计(Domain-Driven Design, DDD)是一种软件设计方法,旨在将软件系统的设计和开发焦点集中在领域模型上,以解决复杂业务问题
2.DDD架构解决了什么问题:
在以前的mvc架构种,三层结构,简单明了。但是当项目越来越大,维护的时间久了的话,就会出现问题,各种PO,VO,DTO对象越来越多,并且会出现多个接口调用同一个VO对象
会导致实体类越来膨胀,时间久了实体类的定义越来越模糊。就变成了一屎山代码。

而DDD是让各个模块尽可能的都在自己的领域包中。那样会尽可能的减少PO VO的调用,相当于在MVC的基础,将实体类的贫血模型,改成了充血模型。

3.DDD架构各个模块
在这里插入图片描述

xfg-frame-api 接口定义
其实该module更多做的是为xfg-frame-trigger提供定义好的RPC接口,但是不仅仅只有这些,还有像HTTP接口,MQ接口,甚至TASK接口都可以在xfg-frame-api中定义好,
因为xfg-frame-trigger引用了xfg-frame-api,所以会直接impl即可

xfg-frame-app 应用封装
该module在我看来是应用启动和配置这一层的,比如你可以设置一些基本的配置,如AOP配置,线程池配置,数据库连接池配置等,通过整个项目的配置文件也在此处,包括 mybatis.xml 和 application.yaml等配置。这个类可以说是非常的重要,打包镜像就是在这一层,该module引入了xfg-frame-trigger 触发调用 和 xfg-frame-infrastructure 基础设施,也就是说将来在打包的时候,它可以被理解为专门为了启动服务而存在的
xfg-frame-domain 领域封装
领域模型服务,是一个非常重要的模块,无论怎么做DDD的分层架构,domain肯定是要存在的,那么在这一层中就要一个个的细分领域模型,也就是包含每个领域模型都要有的三大要素:“模型 仓库 服务”。
xfg-frame-infrastructure 基础设施|
这个层是依赖于domain领域层的,因为在domain层定义了仓库接口 需要在基础层实现,这是一个依赖倒置的一种设计思路。

前面说到了,在基础层实现了domain领域的接口,实现了其对应的接口的功能,而 xfg-frame-trigger中也引用了domain,那么通过多态,实际上,那么trigger中引入的domain里的仓库方法实际上由infrastructure 实现了
xfg-frame-trigger 触发调用
该层相对好理解,主要用于提供接口实现,消息接收,任务执行等,相当于触发器层,主要引入了 domain api 和 types
xfg-frame-types 类型定义
主要是作为通用类型定义层,在我们的系统开发中,会有很多类型的定义,包括基本的Response,Contants和枚举。它们会被其他层引用。

4.领域分层
这个地方是我认为DDD的核心部分了,也就是domain部分,前面其实还是较少介绍的,只说了其包含三个部分“模型 仓库 服务” 但是实际上包含着更多的内容,
如下图所示:

值对象:表示没有唯一标识的业务实体,例如商品的名称、描述、价格等。
实体对象:表示具有唯一标识的业务实体,例如订单、商品、用户等;
聚合对象:是一组相关的实体对象的根,用于保证实体对象之间的一致性和完整性;

4.1依赖倒置原则
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合

理解:高层模块不应该直接调用底层模块的具体实现,应该调用底层模块的抽象,这样当底层模块进行修改的时候不会影响高层模块。

4.2开闭原则
开闭原则(Open Closed Principle, OCP)是面向对象设计的基本原则之一,它要求软件实体(如模块、类、方法等)应当对扩展开放,对修改关闭。这意味着当软件的需求发生变化时,我们不需要修改原有的代码,而是通过扩展的方式来满足新的需求。
对扩展开放:允许在不修改现有代码的情况下增加新的功能或行为。
对修改关闭:限制对现有代码的修改,以减少代码的耦合性和提高系统的可维护性。

实现开闭原则的方法包括:
抽象约束,封装变化:通过接口或抽象类定义一个相对稳定的抽象层,而将可变的部分封装在具体实现类中。这样,当软件需要变化时,只需要添加新的实现类来扩展功能,而不需要修改原有的代码。
依赖抽象而非具体实现:通过依赖抽象类或接口而不是具体实现类来编程,可以提高代码的可复用性和可维护性。
使用设计模式:如策略模式、模板方法模式等,这些模式可以帮助我们更好地遵循开闭原则,实现代码的灵活性和可扩展性。

5.MVC分层架构
分层架构是典型的架构例子,该架构将元素按照“层”的方式组织,每个层有定义明确的职责,同时限制了层与层之间的依赖关系。即:每一层只能依赖于紧邻的下层或下面的任何层。以常见的三层架构为例(三层架构是应用于逻辑视图的分层架构),三层架构将应用程序的类组织展示如图2.1所示:

在实际开发过程中,三层架构随着业务的逐渐庞大会出现很明显的弊端,比如,在表示层中有逻辑层的代码,导致在实际的三层架构模型中,下层会依赖上层,违背了三层分层机构只能上层依赖下层的原则,导致分层边界越来越模糊。

相关文章:

DDD架构

1.DDD架构的概念: 领域驱动设计(Domain-Driven Design, DDD)是一种软件设计方法,旨在将软件系统的设计和开发焦点集中在领域模型上,以解决复杂业务问题 2.DDD架构解决了什么问题: 在以前的mvc架构种,三层结…...

Open3D KDtree的建立与使用

目录 一、概述 1.1kd树原理 1.2kd树搜索原理 1.3kd树构建示例 二、常见的领域搜索方式 2.1K近邻搜索(K-Nearest Neighbors, KNN Search) 2.2半径搜索(Radius Search) 2.3混合搜索(Hybrid Search) …...

C语言编程3:运算符,运算符的基本用法

C语言3🔥:运算符,运算符的基本用法 一、运算符🌿 🎇1.1 定义 运算符是指进行运算的动作,比如加法运算符"“,减法运算符”-" 算子是指参与运算的值,这个值可能是常数&a…...

如何通过SPI机制去实现读取配置文件并动态加载对应实现类

最近写完鱼皮的RPC项目后,打算整理出来一些编程技巧的模版。 有两种实现:1.ServiceLoader 2.SpiLoader 一、直接使用java.util下的ServiceLoader 首先在resource目录下创建 META-INF/services 目录,并且创一个名称为对应要实现的接口的包…...

双链表(数组模拟)

双链表(数组模拟) 什么是双链表数组模拟双链表题目 什么是双链表 双链表不同于单链表的是 每一个节点不但存储了下一个节点的位置,也存储了上一个节点的位置。 数组模拟双链表 所以如果用数组的话,就需要创建三个数组。 题目 …...

ChatGPT 5.0:一年半后的展望与看法

在人工智能领域,每一次技术的飞跃都预示着未来生活与工作方式的深刻变革。随着OpenAI在人工智能领域的不断探索与突破,ChatGPT系列模型已成为全球关注的焦点。当谈及ChatGPT 5.0在未来一年半后可能发布的前景时,我们不禁充满期待,…...

城市地下综合管廊物联网远程监控

城市地下综合管廊物联网远程监控 城市地下综合管廊,作为现代都市基础设施的重要组成部分,其物联网远程监控系统的构建是实现智慧城市建设的关键环节。这一系统集成了先进的信息技术、传感器技术、通信技术和数据处理技术,旨在对埋设于地下的…...

VS 附加进程调试

背景: 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1: 打开VS,调试->附加到进程,出…...

核函数的深入理解

核函数 (Kernel Function)是一种在高维特征空间中隐式计算内积的方法,它允许在原始低维空间中通过一个简单的函数来实现高维空间中的内积计算,而无需显式地计算高维特征向量。 核函数 的基本思想是通过一个映射函数 ϕ \phi ϕ …...

使用Ckman部署ClickHouse集群介绍

使用Ckman部署ClickHouse集群介绍 1. Ckman简介 ClickHouse Manager是一个为ClickHouse数据库量身定制的管理工具,它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源,开源地址为&…...

「前端工具」postman接口测试工具详解

Postman 是一款流行的 API 开发工具,用于构建和测试 RESTful API。以下是 Postman 的一些关键特性和使用方法的详解: 1. 界面和基本操作 工作区:Postman 的主界面,用于显示集合、环境和全局变量。请求构建器:用于输入请求的 URL、HTTP 方法、请求头、请求体等。响应区:显…...

生成requirements.txt

pip install pipreqs pipreqs ./ --encodingutf-8 --force python导出requirements.txt的几种方法总结...

ubuntu ceph部署

ubuntu ceph部署 参考文档:http://docs.ceph.org.cn/start/ 节点配置 1个mon节点,3个osd节点 安装前准备 安装ceph-deploy 添加 release key wget -q -O- https://download.ceph.com/keys/release.asc | sudo apt-key add -添加Ceph软件包源&…...

2024.7.8

2024.7.8 【追逐影子的人,自己就是影子 —— 荷马】 Monday 六月初三 讲的根本听不懂好吧! 目前只写了三道题(但是黑色 确实是没见过这么抽象的数据结构 Gregor and the Two Painters Number of Components Equal LCM Subsets 这个lcm确实…...

Spring 外部jar包Bean自动装配

Spring 外部jar包Bean自动装配 背景介绍 公共代码模块被作为jar包引入业务项目,前者定义的bean即使添加了Component注解由于不会被扫描到也就无法被Spring管理。此处通过Spring SPI机制来完成 使用 spring.factories 在外部 jar 包中创建 spring.factories 文件&a…...

2通道音频ADC解码芯片ES7243L、ES7243E、ES7243,用于低成本实现模拟麦克风转换为IIS数字话筒

前言: 音频解码芯片某创参考价格: ES7243L 500:¥1.36 / 个 ES7243E 500:¥1.66 / 个 ES7243 500: ¥1.91 / 个 其中ES7243L工作电压为1.8V,与其他两款的3.3V工作电压不同&…...

uniapp跨域问题解决

找到menifest文件,在文件的最后添加如下代码: // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…...

[C++][ProtoBuf][Proto3语法][一]详细讲解

目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰: singular:消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中,字段默认使⽤该规则 repeat…...

千古雄文《渔樵问对》原文、译文、解析

邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义 【邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义】 邵雍(1011年1月21日-1077年7月27日,宋真宗大中祥符四年十二月二十五日戌时生至神宗熙宁十…...

uniapp 开发备忘录-防坑指南

uniapp 开发备忘录-防坑指南 npm run dev:mp-weixin 编译微信小程序报错: [plugin:uni:mp-using-component] Expected ‘,’ or ‘}’ after property value in JSON at position 解决方案:升级uniapp 到最新 alpha 版。(2024年7月13日&am…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...