DDD领域驱动开发

article/2025/10/12 23:57:34

文章目录

    • DDD(Domain Driving Design)领域驱动开发
        • 1、微服务设计为什么选择DDD
          • 1、架构对比
          • 2、微服务的问题
          • 3、战略设计(业务层面-业务架构)
          • 4、战术设计(技术层面-系统架构):
          • 5、DDD和微服务
        • 2、领域、子域、核心域、通用域、支撑域
        • 3、限界上下文
        • 4、实体和值对象:从领域模型的基础单元看系统设计
          • 实体对象(业务层面)
          • 值对象(数据层面)
          • 实体对象VS值对象
        • 5、怎样设计聚合?聚合和聚合根
          • 聚合根解决了什么问题?
          • 聚合根承担的角色是什么?
          • 如何判断一个实体是否是聚合根?
        • 6、领域事件
        • 7、中台

DDD(Domain Driving Design)领域驱动开发

1、微服务设计为什么选择DDD

1、架构对比
  • 单机架构:数据驱动架构

  • 集中式架构:面向对象的方式(三层架构)

  • 分布式微服务架构:应用之间解藕,解决单体用扩展性和弹性伸缩能力不足问题

2、微服务的问题
  • 微服务粒度

  • 怎样拆分

  • 边界是什么

DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。

img
3、战略设计(业务层面-业务架构)

建立领域模型、划分领域边界,从业务的视角来划分微服务边界(收敛的过程)

  • 实体
  • 命令
  • 事件

领域模型:指导微服务的设计和拆分。事件风暴是建立领域模型的主要的方法,

事件风暴:

  • 从发散到收敛的一整个过程
  • 采用方法:用例分析、场景分析、用户旅程分析
  • 产出:产出实体、命令、事件等领域对象,将领域对象从不同维度进行聚类形成聚合限界上下文等边界,建立领域模型

逻辑边界、物理边界

4、战术设计(技术层面-系统架构):

侧重于领域模型的实现,侧重于代码逻辑的设计和实现

实现层面

  • 逻辑边界
  • 物理边界
5、DDD和微服务

DDD:主要关注从业务领域视角划分领域边界,通过业务抽象建立领域模型,维持业务和代码层面的一致性

微服务:主要是从技术层面,实现去中心化数据管理和去中心化服务治理,关注微服务的独立开发、测试、构建和部署

总结:DDD是一种架构设计方法,微服务是一种架构风格。DDD是一种从业务视角去分离系统建设复杂度的手段,应用于微服务中,DDD解决微服务设计过程中边界难以界定的问题

2、领域、子域、核心域、通用域、支撑域

  • 领域:指一种特定的范围。用于限制业务边界和范围的。

  • 子域:对应更小的业务范围

    • 核心域:决定产品和公司核心竞争力的子域,业务成功的主要因素和公司的核心竞争力
    • 通用域:需要用到的通用系统
    • 支撑域:具有企业特性,但不具有通用性

复杂问题拆解细分,建立子域

  • 研究对象
  • 研究对象细分

领域的核心思想就是将问题域逐级细分,来降低业务理解和系统实现的复杂度。通过领域细分,逐步缩小微服务需要解决的问题域,构建合适的领域模型,而领域模型映射成系统就是微服务了。通过领域划分,区分不同子域在公司内的不同功能属性和重要性(核心域、通用域、支撑域),从而公司可对不同子域采取不同的资源投入和建设策略

3、限界上下文

  • 通用语言定义上下文含义,限界上下文则定义领域边界

  • 限界上下文就是用来细分领域,从而定义通用语言所在的边界

  • 一个限界上下文理论上就可以设计为一个微服务

4、实体和值对象:从领域模型的基础单元看系统设计

DDD 引入值对象是希望实现从“数据建模为中心”向“领域建模为中心”转变。实体和值对象是微服务底层的最基础的对象。DDD 提倡从领域模型设计出发,而不是先设计数据模型。

实体对象(业务层面)
  • 实体和值对象是组成领域模型的基础单元。

  • 在代码模型中,实体的表现形式是实体类,这个类包含了实体的属性和方法

值对象(数据层面)

在领域建模时,我们可以将部分对象设计为值对象,保留对象的业务涵义,同时又减少了实体的数量;在数据建模时,我们可以将值对象嵌入实体,减少实体表的数量,简化数据库设计

img
实体对象VS值对象
  • 实体一般对应业务对象,它具有业务属性和业务行为;而值对象主要是属性集合,对实体的状态和特征进行描述。

总结:值对象的引入,保留了业务层面的含义,减少了实体数量,并且在数据建模层面,简化了数据库设计

5、怎样设计聚合?聚合和聚合根

  • 聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。

  • 聚合在 DDD 分层架构里属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑

聚合根解决了什么问题?

聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题

聚合根承担的角色是什么?

如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。

如何判断一个实体是否是聚合根?

可以结合以下场景分析:是否有独立的生命周期?是否有全局唯一 ID?是否可以创建或修改其它对象?是否有专门的模块来管这个实体?

6、领域事件

用来表示领域中发生的事件。一个领域事件将导致进一步的业务操作,在实现业务解耦的同时,还有助于形成完整的业务闭环。领域事件来驱动业务的流转

7、中台

img

http://chatgpt.dhexx.cn/article/PcsbAMyS.shtml

相关文章

Linux驱动开发|USB驱动

USB驱动 USB接口很复杂,不同的设备器协议也不同,因此本文仅介绍如何使能Linux内核自带的USB驱动,不涉及USB驱动开发 一、USB接口简介 1.1 USB介绍 USB(Universal Serial Bus),即通用串行总线。由英特尔…

window10+vs2022配置window驱动开发环境

测试模式 开发的驱动程序没有官方数字签名,只能在测试模式下加载。 命令行键入以下命令,重启电脑后桌面右下角出现测试模式字样,说明进入了测试模式 bcdedit /set testsigning on 命令行键入以下命令,重启电脑后桌面右下角没有了测…

win10驱动开发——驱动签名

win1803开始直接禁用驱动强制签名的方式不行了 1.设置环境 bcdedit -set NOINTEGRITYCHECKS ON bcdedit -set TESTSIGNING ON bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS2.配置环境变量 找到makecert.exe文件位置如【C:\Program Files (x86)\Windows Kits\10\bin\1…

Windows 10 驱动开发 及 驱动签名

记录下在公司开发驱动的一些注意事项, 驱动当前仅针对win10x64. 常识: 最早的驱动开发sdk是 ntddk, 类似于用户层的win32 api, 后面为了增加对pnp(Plug-and-Play, 即插即用)的支持, 迭代为 wdm. 后面因为wdm开发过于繁琐, 微软发布了 WDF 框架, 类似于 用户层的 …

Linux——驱动开发

一、驱动开发概述 1.1 驱动形式 驱动代码的形式一般可分为build-in和module两种形式,build-in是在编译linux同时将pcie的驱动代码编译到内核中,启动的时候就载入该驱动代码;module是在linux启动完成后通过终端输入命令insmod/remod进行载入…

Windows 驱动开发 新手入门(一)

Windows 驱动开发 新手入门(一) 引言驱动介绍Win10 WDK 建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP 引言 首先祝朋友们新年快乐,然后呢,因为无聊&#xff…

驱动开发学习

驱动 1、驱动开发环境 完成系统移植的三步:u-boot启动引导程序、内核镜像、文件系统,u-boot启动引导程序最好固化到开发板上,内核镜像通过tftp服务从ubuntu下载,文件系统通过nfs服务从ubuntu共享到开发板,开发板启动…

Linux设备驱动开发详解

Linux设备驱动开发详解 Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核及内核编程4. linux内核模块5. linux文件系统与设备文件6. 字符设备驱动7. linux设备驱动中的并发控制8. linux设备驱…

QT部件基类——QWidget与QDialog

一、默认基类 QT提供的默认部件基类包括QMainWindow、QWidget、和QDialog这三种,这三个部件基类也是用的最多的。 QWidget类是所有部件对象的基类,被称为基础窗口部件,继承关系详看QWidget类关系图。QWidget提供自我绘制和处理用户输入等基本…

qt 中 qwidget 嵌入 qml

以上是效果图&#xff0c; 整个窗口是 qml 窗口 核心代码 #ifndef WIDGETANCHOR_H #define WIDGETANCHOR_H#include <QObject> #include <QQuickItem> #include <QWidget> #include <QQmlApplicationEngine> #include <QQmlContext>class WgtAn…

QWidget尺寸限定

1、控件只能在最小和最大之间进行调整&#xff0c;不能超过范围。 ①直接宽高同时设置 window.setMinimumSize(200, 200)&#xff1b; window.setMaximumSize(500, 500) app QApplication(sys.argv)window QWidget()window.setWindowTitle("最小最大窗口")windo…

QWidget居中显示

须知 以下函数只要继承QWidget都可以使用.例如 QDialog, QPushButton( -v- 一个居中的”引爆按钮”)关于坐标问题: qt窗口坐标原点是在”左上角”的. 如图, (x2, y2)是我窗口的分辨率的一半无论目前我的窗口在什么位置,我只要把窗口原点设置为(x1, y1)就行了.所以目前我要获得…

QWidget事件消息

1、用户操作界面时会产生特定的事件消息。 API&#xff1a;显示和关闭事件、移动事件、调整大小、鼠标事件、键盘事件、焦点事件、拖拽事件、绘制事件、改变事件、右键菜单、输入法。 应用场景&#xff1a;当一个控件被触发了一个特定的行为时&#xff0c;就会调用特定的方法…

QWidget的isHidden和isVisible

文章目录 问题的出现QWidget的show()函数QWidget的isVisible和isHidden源码追溯 QWidget的isHidden和isVisible 问题的出现 最近在写代码的时候&#xff0c;出现了一个问题&#xff0c;我新建了两个类&#xff0c;分别是Chapter2和ConsecutiveCurtain // ConsecutiveCurta…

QWidget鼠标操作

1、设置鼠标形状&#xff1a;鼠标放置在不同控件上&#xff08;有不同功能时&#xff09;鼠标的形状是不一样的。 鼠标跟踪&#xff1a;鼠标在某一个控件上移动&#xff0c;则会向对应的控件对象发送一个消息&#xff0c;去调用具体的某一个方法&#xff0c;可以在方法里面监听…

QWidget旋转方法

参考链接&#xff1a;https://stackoverflow.com/questions/43388464/rotate-whole-qwidget-by-angle 说明&#xff1a; 本文实现方法本质是使用QGraphics三件套&#xff0c;即View、Scene、Item&#xff0c;将QWidget控件作为Item显示&#xff0c;从而实现角度控制的目的&…

QWidget设置背景图及圆角

在Qt开发过程中&#xff0c;QWidget是经常作为主窗体的父窗口&#xff0c;有时我们需要对主窗口设置背景&#xff0c;设置圆角以达到美观的效果&#xff0c;通常的有以下三种方法&#xff1a;qss, QPalette设置以及paintEvent绘制。下面介绍这三种方法。 背景设置介绍 方法一&a…

QWidget之adjustSize

from PyQt5.Qt import * import sys# 创建一个应用程序对象 app QApplication(sys.argv)window QWidget()label QLabel(window) label.setText(学无止境) label.move(100, 100) label.setStyleSheet(background-color:gray)def changeCao():tmp label.text()学无止境label.…

初识QWidget

初识QWidget 在Qt中QWidget是一个非常关键和重要的类&#xff0c;推荐初学Qt的同学们第一个学习此类 在Qt的帮助手册中我们搜索QWidget&#xff0c;可以看到下图的描述 通过帮助手册我们了解到如果想使用QWidget这个类&#xff0c;需要包含QWidget这个头文件&#xff0c;Qt特…

QWidget继承

查看QWidget的继承于哪个类 方法一 随便写一个类继承自己QWidget 按住Ctrl鼠标单击QWidget即可 方法二 print(QWidget.__base__)方法三 print(QWidget.mro()) 链条式的继承展示 enjoy