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所示:

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

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

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

相关文章

Linux系统下的用户管理模式

Linux系统下的用户管理模式 本文以属于Linux系统基本概念,如果以查找教程教程,解决问题为主,只需要查看本文后半部分。 如需要系统性学习请查看本文前半部分。 文章目录 Linux系统下的用户管理模式1. Linux下用户的概念2. 创建不同类型的用户…

Johnson Counter

目录 描述 输入描述: 输出描述: 参考代码 描述 请用Verilog实现4位约翰逊计数器(扭环形计数器),计数器的循环状态如下。 电路的接口如下图所示。 输入描述: input clk , input …

第一百四十九节 Java数据类型教程 - Java子字符串、字符串转换

Java数据类型教程 - Java子字符串 获取子字符串 我们可以使用substring()方法来获取字符串的子部分。 我们可以将开始索引作为参数,并返回一个从开始索引开始到字符串结尾的子串。 我们还可以将开始索引和结束索引作为参数。 它返回从开始索引开始的子字符串和小…

[数仓]七、离线数仓(PrestoKylin即席查询)

第1章 Presto 1.1 Presto简介 1.1.1 Presto概念 1.1.2 Presto架构 1.1.4 Presto、Impala性能比较 Presto、Impala性能比较_presto和impala对比-CSDN博客 测试结论:Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Re…

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf:配置文件目录log:日志文件目录html:项目文件目录(这里可以存放web文件) 创建挂…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析(Domain Name System Resolution)是互联网服务中的一个核心环节,它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

鸿蒙小练习

bean对象 export class BannerImage{id:numberurl:stringtargetUrl:stringproductId:numberconstructor(id: number, url: string, targetUrl: string, productId: number) {this.id idthis.url urlthis.targetUrl targetUrlthis.productId productId} }export class d…

乐鑫ESPC3 ESP8685 WiFi蓝牙模块透传程序设置教程,抛开繁琐AT指令,简单Web页面配置,即可实现透传

完整文档请下载规格书 TTL-WiFi 透传产品 使用手册 一. 产品概述 二. 接口定义 三. 软件透传WEB配置使用说明 3.1 STATUS配置界面 3.2 MODULE配置界面 n Serial(串口配置) n WiFi(WiFi配置) n Networks(网络…

mybatis mapper.xml 比较运算符(大于|小于|等于)的写法: 转义和<![CDATA[]]>

文章目录 引言I 使用xml 原生转义的方式进行转义II 使用 <![CDATA[ 内容 ]]>引言 应用场景:查询时间范围 背景:在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突 <![CDATA[]]> 比 转义符 来的繁琐 <![CDATA[]]> 表示xml解析器忽略…

怎样优化 PostgreSQL 中对日期时间范围的模糊查询?

文章目录 一、问题分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期时间格式不统一&#xff08;三&#xff09;复杂的查询条件 二、优化策略&#xff08;一&#xff09;使用合适的索引&#xff08;二&#xff09;规范日期时间格式&#xff08;三&a…

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护&#xff1a; 使用Docker搭建集群使用Hado…

Chain-of-Verification Reduces Hallucination in Lagrge Language Models阅读笔记

来来来&#xff0c;继续读文章了&#xff0c;今天这个是meta的研究员们做的一个关于如何减少LLM得出幻觉信息的工作&#xff0c;23年底发表。文章链接&#xff1a;https://arxiv.org/abs/2309.11495 首先&#xff0c;这个工作所面向的LLM的问答任务&#xff0c;是list-based q…

Nginx理论篇与相关网络协议

Nginx是什么&#xff1f; Nginx是一款由C语言编写的高性能、轻量级的web服务器&#xff0c;一个线程能处理多个请求&#xff0c;支持万级并发。 优势&#xff1a;I/O多路复用。 I/O是什么&#xff1f; I指的是输入&#xff08;Input&#xff09;,O是指输出&#xff08;Outp…

java中 使用数组实现需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求实现&#xff1a; 设计一个java类&#xff0c;java方法&#xff0c;根据用户手动输入的绩点&#xff0c;从而获取到绩点最高的成绩。 实现业务逻辑的代码块 import java.util.Scanner;public class PointDemo {/*** 需求&…

python-24-零基础自学python while循环+交互+数据的存储

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 文件处理 with open&#xff08;&#xff09;while 练习内容&#xff1a;10章练习题10-3、10-4、10-5 练习10-3&#xff1a;访客 编写一个程序&#xff0c;提示用户输入名字。用户做…

SpringBoot实战:轻松实现XSS攻击防御(注解和过滤器)

文章目录 引言一、XSS攻击概述1.1 XSS攻击的定义1.2 XSS攻击的类型1.3 XSS攻击的攻击原理及示例 二、Spring Boot中的XSS防御手段2.1 使用注解进行XSS防御2.1.1 引入相关依赖2.1.2 使用XSS注解进行参数校验2.1.3 实现自定义注解处理器2.1.4 使用注解 2.2 使用过滤器进行XSS防御…

《算法笔记》总结No.5——递归

一.分而治之 将原问题划分为若干个规模较小而结构与原问题相同或相似的子问题&#xff0c;然后分别解决这些子问题&#xff0c;最后合并子问题的解&#xff0c;即可得到原问题的解&#xff0c;步骤抽象如下&#xff1a; 分解&#xff1a;将原问题分解为若干子问题解决&#x…

[氮化镓]Kevin J. Chen组新作—肖特基p-GaN HEMTs正栅ESD机理研究

这篇文章是发表在《IEEE Electron Device Letters》上的一篇关于Schottky型p-GaN栅极高电子迁移率晶体管&#xff08;HEMTs&#xff09;的正向栅极静电放电&#xff08;ESD&#xff09;机理研究的论文。文章由Jiahui Sun等人撰写&#xff0c;使用了基于碳化硅&#xff08;SiC&a…

Java--多态

1.多态为同一方法根据发送对象的不同而采用多种不同的行为方式 2.一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多 3.多态存在的条件 1.有继承关系 2.子类重写父类方法 3.父类引用指向子类对象 4.多态是方法的多态&#xff0c;属性没有多态 5.由于…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

全网最适合入门的面向对象编程教程&#xff1a;11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要&#xff1a; 本节课&#xff0c;我们主要讲解了在 Python 类的继承中子类如何进行初始化、调用父类的属性和方法&#xff0c;同时讲解了模拟串口传感器和…