DDD 架构之领域驱动设计【通俗易懂】

devtools/2025/3/1 13:29:34/

文章目录

    • 1. 前言
    • 2. MVC 对比 DDD
    • 3. DDD 分层架构
    • 4. 完整业务流程

1. 前言

官方回答:DDD是一种应对复杂业务系统的设计方法,通过将软件设计与业务领域紧密结合,帮助开发人员构建清晰、可维护的领域模型。在复杂的业务系统中,它能显著提升软件设计的质量和可维护性。

说人话:传统的 MVC 三层架构业务混杂,耦合度太高,,N 年后…,这谁写的?绝对不是我,前人挖坑后人填坑,根本无从下手!

于是出现了 DDD 四层架构,简而言之,更抽象啦!

遵循三大原则:单一职责原则、开放封闭原则和依赖倒转原则。一个类只负责一项功能,对外开放扩展,对内不允许修改,并且要依赖接口开发,而非具体的实现类。

核心概念:
领域(Domain):软件要解决的业务问题。
限界上下文(Bounded Context):业务中的一个独立模块,比如“订单管理”或“用户管理”。
实体(Entity):有唯一标识的对象,比如“用户”。
值对象(Value Object):没有唯一标识的对象,比如“地址”。
聚合(Aggregate):一组相关对象的集合,比如“订单”和“订单项”。
领域服务(Domain Service):处理跨多个对象的业务逻辑。
仓储(Repository):用来存取聚合的接口。

DDD 特点:
① 业务优先技术,以领域划分为设计基础;
② DDD 以通用语言为建设核心,每个领域内有相同的包结构;
③ 以一系列抽象概念为开发模式;
④ 以四层架构为基本思想;
⑤ 有助于解决系统老化的问题。

2. MVC 对比 DDD

① 传统 MVC 是三层架构:控制层、业务层、基础层。技术优先,所有业务都混在一起:

在这里插入图片描述

MVC 架构存在的问题:
① 可维护性差,大量的第三方模块影响核心代码的稳定性;
② 可扩展性差,业务逻辑与数据存储相互依赖,无法复用;
③ 可测试性差,庞大事务脚本与基础设施强耦合,无法进行单元测试。

如何构建高质量应用?高内聚,低耦合!

② DDD 是四层架构:用户接口层、应用层、领域层、基础层。业务优先,以业务领域来划分模块:

在这里插入图片描述

3. DDD 分层架构

用户接口层:负责展示和交互,通常包括Web界面、API接口等。
应用层:协调领域层和外部系统,应用层不包含业务逻辑,主要调用领域服务。
领域层:核心业务逻辑,包括实体、值对象、聚合、领域服务等。
基础设施层:提供技术实现,如数据库访问、消息队列、外部API调用等。

核心的业务逻辑全部放在领域层,其余层都可以看作是转发站!

在这里插入图片描述

目录结构如下:

在这里插入图片描述

4. 完整业务流程

第一步,前端发起 HTTP 请求 ☞

第二步,请求进入用户接口层的 OrderController 中 ☞

第三步,OrderController 调用应用层的 OrderAppService ☞

第四步,OrderAppService 又调用了领域层的 OrderService ☞

第五步,OrderService 调用了仓储接口 OrderRepository ☞

第六步,由基础层的 OrderRepositoryImpl 处理具体的数据库关系。

如果业务简单,OrderAppService 可直接调用 OrderRepository!


http://www.ppmy.cn/devtools/163628.html

相关文章

c++中迭代器和指针有什么区别?

在 C 中,迭代器和指针虽然在某些场景下有相似的行为,但它们在设计目的、功能和使用场景上有本质区别。以下是详细对比和最佳实践: 一、核心区别对比表 特征指针迭代器本质原生数据类型,直接存储内存地址类对象,抽象容…

Android用ExoPlayer获取视频正确的尺寸

最近在实现视频预加载功能,遇到了较多的疑问未解决,但机缘巧合解决了困扰我很久的某些视频 展示异常的问题(被压扁),如下图 我的实现方法: Overridepublic void onVideoSizeChanged(VideoSize videoSize)…

nuxt常用组件库html-validator应用解析

html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG),以检测可能导致水合错误的HTML常见问题,有助于减少水合错误,检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…

鸿蒙开发-画布综合示例

以下是一个更复杂的ArkTS示例,它展示了如何在画布上绘制多个形状(包括圆形、矩形和文本),并处理触摸事件来改变画布上的某些属性(如颜色)。 示例代码 import { Color, Point } from ohos.build.attr; imp…

【蓝桥杯集训·每日一题2025】 AcWing 5439. 农夫约翰真的种地 python

AcWing 5439. 农夫约翰真的种地 题目描述 Week 2 2月27日 农夫约翰在他的农场种植了 N N N 个芦笋,编号 1 ∼ N 1 \sim N 1∼N。 其中,第 i i i 个芦笋的初始高度为 h i h_i hi​,每经过一天高度会增长 a i a_i ai​。 给定一个 0…

Python在实际工作中的运用-指定目录内所有Excel文件转CSV

闲来无事浏览到《【办公自动化】使用Python批量处理Excel文件并转为csv文件》这篇博文,关于多层目录Excel转Csv在处理过程中略显繁复,而且灵活度不高,代码如下: import pandas as pd import os from datetime import datetime # …

dify镜像拉取不下来如何解决

# 启动docker(一定要先启动再添加dns) systemctl start docker #添加国境镜像和dns sudo vim /etc/docker/daemon.json { "registry-mirrors":[ "https://dockerpull.pw", "https://dockerhub.icu", "https://hu…

Redis 分布式锁

概念 在⼀个分布式的系统中,也会涉及到多个节点访问同⼀个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于 "线程安全" 的问题。但 C 的 std::mutex 只能在当前进程中⽣效, 在分布式的这种多个进程多个主机的场景下就…