【学习笔记】DDD领域驱动设计篇

news2024/9/27 15:29:17

【学习笔记】DDD领域驱动设计篇

文章目录

  • 【学习笔记】DDD领域驱动设计篇
    • 什么是DDD?
    • DDD的优缺点
    • DDD的架构
    • 框架详解
      • User Interface层
      • application层
      • domain层
      • infrastructure层
    • 结语

什么是DDD?

DDDDomain driven design (领域驱动设计)的简称,是一种软件设计和开发的方法论,特别适用于复杂业务领域软件设计和开发。

目前国内很多大型公司正是在实用 DDD 进行业务开发。那为什么不使用经典和相对稳定的 MVC 架构,却使用 DDD 架构进行业务开发?那 DDD 有哪些优点,又有哪些缺点呢?

带着以上问题我们接着往下看~

点击查看图片来源

DDD的优缺点

那就先来说说 DDD 的优点:

  • 面向对象设计,数据行为绑定,告别贫血模型

  • 降低复杂度,分而治之

  • 优先考虑领域模型,而不是切割数据和行为

  • 准确传达业务规则,业务优先

  • 代码即设计

  • 它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现业务和技术统一的架构演进

  • 领域知识共享,提升协助效率

  • 增加可维护性和可读性,延长软件生命周期

  • 中台化的基石

在这里插入图片描述

当然 DDD 也不是万能的,DDD也是有些场景是不适用的。那接下来我们就说说 DDD 的缺点:

性能DDD 是基于聚合来组织代码,对于高性能场景下,加载聚合中大量的无用字段会严重影响性能,比如报表场景中,直接写 SQL 会更简单直接。

事务DDD 中的事务被限定在限界上下文中,跨多个限界上下文的场景需要开发者额外考虑分布式事务问题。

难度系数高,推广成本大DDD 项目需要领域专家专家,且需要特别熟悉业务、建模、OOP,对于管理者来说评估一个人是否真的能胜任也是一件困难的事情。

当然说到 DDD 也离不开 MVC ,那为什么现在既有用 MVC 的设计理念,又有使用 DDD 架构的呢?那我就来对比两者之前的区别。

MVC : 上来就可以开干,短平快,前期用起来很香,整体开发效率也更高,所以对于紧急,或者不那么重要的项目,我会直接用 MVC 怼,不好的地方就是,后面会越来越复杂,可能最后就是一坨屎山,但是很多时候,比如老板进度催的紧,我哪想到那么多以后呢?

DDD : 前期需要花大量时间设计好领域模型,对于一些基础组件,或者一些核心服务,如果对象模型非常复杂,建议采用 DDD ,前期可能会稍微痛苦一些,但是后期维护起来会非常方便。


DDD的架构

User Interface —— 用户界面层。提供与用户/调用者交互的接口,可以是View,也可以是Restful api,还可以是二进制形式的tcp协议接口等。

Application —— 应用服务层。组合domain和infrastructure,完成具体的业务逻辑。

Domain —— 业务领域层。是ddd中的核心层,内聚所有的业务逻辑,保持领域的一致性。通常他可能会用到infrastructure层的公共组件。

Infrastructure —— 基础设施层。提供公共服务组件,比如validation、登录态校验、trace日志记录等等。

对比于MVC架构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQjCO3oG-1669988886814)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20221202210930615.png)]

还有一种 六边形架构图

img

在遵循分层架构思想的基础上,引入了六边形架构风格,对内对外均通过适配器+端口的方式呈现:

  • 面向用户侧 ,提供http端口,并使用SpringMVC框架的RequestMapping、Controller等组件实现对http 请求的解析,转化为Application层可识别的业务dto对象,这里的Controller+RequestMapping便起着适配器的作用;
  • 面向第三方服务 ,通过httpclient和tcpclient的适配,可以对接多种协议的第三方服务端口;
  • 面向存储层 ,通过mongoclient的适配,访问mongodb;通过mybatis的适配,访问oracle;通过redisclient的适配,访问redis;
  • 面向消息中间件 ,通过mqclient的适配,方为rabbitMQ;

是不是很简单呢?

点击查看图片来源

框架详解

User Interface层

门面层,对外以各种协议提供服务,该层需要明确定义支持的服务协议、契约等。包含:

dto

包括request和response两部分,通过它定义入参和出参的契约,在dto层可以使用基础设施层的validation组件完成入参格式校验

controller

支持不同访问协议的控制器实现,比如:http/restful风格、tcp/二进制流协议、mq消息/json对象等等。

controller使用基础设施层公共组件完成许多通用的工作:

  • 调用RequestMapping(SpringMVC公共组件)完成servlet路由;
  • 调用checklogin完成登录态/权限校验;
  • 调用logging组件完成日志记录;
  • 调用message-resource组件完成错误信息转义,支持I18N;

application层

  • service:

应用服务层,组合domain层的领域对象和基础设施层的公共组件,根据业务需要包装出多变的服务,以适应多变的业务服务需求。

应用服务层主要访问domain领域对象,完成服务逻辑的包装。

应用服务层也会访问基础设施层的公共组件,如rabbitmq,完成领域消息的生产等。

  • assembler:

组装器,负责将多个domain领域对象组装为需要的dto对象,比如查询帖子列表,需要从Post(帖子)领域对象中获取帖子的详情,还需要从User(用户)领域对象中获取用户的基本信息。

组装器中不应当有业务逻辑在里面,主要负责格式转换、字段映射等职责。

domain层

业务领域层,是我们最应当关心的一层,也是最多变的一层,需要保证这一层是高内聚的。确保所有的业务逻辑都留在这一层,而不会遗漏到其他层。按照ddd(domain driven design)理论,主要有如下概念构成:

  • domain entity:

领域实体。有唯一标识,可变的业务实体对象,它有着自己的生命周期。比如社区这一业务领域中,‘帖子’就是一个业务实体,它需要有一个唯一性业务标识表征,同时他的状态和内容可以不断发生变化。

  • domain value object

领域值对象。可以没有唯一性业务标识,且一旦定义,他是不可变的,它通常是短暂的。这和java中的值对象(基本类型和String类型)类似。比如社区业务领域中,‘帖子的置顶信息’可以理解为是一个值对象,不需要为这一值对象定义独立的业务唯一性标识,直接使用‘帖子id‘便可表征,同时,它只有’置顶状态‘和’置顶位置‘,一旦其中一个属性需要发生变化,则重建值对象并赋值给’帖子‘实体的引用,不会对领域带来任何负面影响。

  • domain factory

领域对象工厂。用于复杂领域对象的创建/重建。重建是指通过respostory加载持久化对象后,重建领域对象。

  • domain service

领域服务。区别于应用服务,他属于业务领域层。

可以认为,如果某种行为无法归类给任何实体/值对象,则就为这些行为建立相应的领域服务即可。比如:转账服务(transferService),需要操作借方/贷方两个账户实体。

传统意义上的util static方法中,涉及到业务逻辑的部分,都可以考虑归入domain service。

  • domain event

领域事件。领域中产生的一些消息事件,通过事件通知/订阅的方式,可以在性能和解耦层面得到好处。

  • repository

仓库。我们将仓库的接口定义归类在domain层,因为他和domain entity联系紧密。仓库用户和基础实施的持久化层交互,完成领域对应的增删改查操作。

仓库的实际实现根据不同的存储介质而不同,可以是redis、oracle、mongodb等。

鉴于现在社区服务的存储介质有三套:oracle、redis、mongodb,且各个存储介质的字段属性名不一致,因此需要使用translator来做翻译,将持久化层的对象翻译为统一的领域对象。

  • translator

翻译器。将持久化层的对象翻译为统一的领域对象。

翻译器中不应当有业务逻辑在里面,主要负责格式转换、字段映射等职责。

  • AggregateRoot

聚合根(AggregateRoot):聚合本身也是一个实体,聚合可以包含其他实体,其他实体不能脱离聚合而单独提供服务,比如一篇文章下的评论,评论必须从属于文章,没有文章也就没有评论。仓库层(repository)也必须是以聚合为核心提供服务的。

infrastructure层

基础设施层提供公共功能组件,供controller、service、domain层调用。

  • repository impl:

对domain层repository接口的实现,对应每种存储介质有其特定实现,如oracle的mapper,mongodb的dao等等。repository impl会调用mybatis、mongo client、redis client完成实际的存储层操作。

  • checkLogin:

权限校验器,判定客户端是否有访问该资源的权限。提供给User Interface层的Controller调用。

  • exception:

异常分类及定义,同时提供公共的异常处理逻辑,具体由ExceptionHandler实现。

  • transport:

transport完成和第三方服务的交互,可以有多种协议形式的实现,如http+json、tcp+自定义协议等,配套使用的还有Resolver解析器,用于对第三方服务的请求和响应进行适配,提供一个防腐层(AnticorruptionLayer,DDD原书P255)的作用。

  • transcation:

提供事务管理,交给Spring管理。

  • logging:

日志模块,记录trace日志,使用log4j完成。

  • message resource:

消息资源管理,交给Spring统一管理。

点击查看图片来源

结语

通过上述描述相信大家也应该了解了一些关于 DDD 架构的设计理念和方法。也希望本篇文章能够帮助大家,最好也是能够通过一些相关的代码联系和一些开源项目去理解 DDD 这个业务架构。

那么本期分享就到这里啦,我们下期再见!

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

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

相关文章

GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 获取面的坐标数据信息框进行展示 渲染图片的两种方式

GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 & 获取面的坐标数据信息框进行展示 & 渲染图片的两种方式 效果-获取面的坐标 效果-渲染图片的2种方式 代码 index.html <!DOCTYPE html> <html> <meta charset"UTF-8">…

[附源码]计算机毕业设计springboot校园招聘系统设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

家装家居行业该如何进行网络推广?

咱们这里谈家居家装行业&#xff0c;指得是置办新家的大件产品&#xff0c;不是锅碗瓢盆&#xff0c;也不是床单被罩那些。如衣柜、橱柜、灯具、智能马桶、窗户、瓷砖、沙发、床等等这些是咱们讨论的范围。 在家装家居行业中&#xff0c;每个产品的客单价通常很高&#xff0c;回…

更改 HIVE 表字段数据类型有哪些注意事项?

更改 HIVE 表字段数据类型有哪些注意事项&#xff1f; 1. 使用 HIVE 表的常见规范 在大数据离线分析场景中&#xff0c;在数据建模/表格式这一层&#xff0c;目前使用最多的还是 APACHE HIVE 这一数据仓库框架&#xff08;湖仓一体的框架&#xff0c;如 Iceberg/DeltaLake/Hu…

深入理解 Web 协议:HTTP 2

目录 本篇将详细介绍 http2 协议的方方面面&#xff0c;知识点如下&#xff1a; HTTP 2 连接的建立 HTTP 2 中帧和流的关系 HTTP 2 中流量节省的奥秘&#xff1a;HPACK 算法 HTTP 2 协议中 Server Push 的能力 HTTP 2 为什么要实现流量控制&#xff1f; HTTP 2 协议遇到的…

记一次PDU接室外监控溶解事故

近期要新增20-30个室外监控&#xff0c;监控位于山道&#xff0c;山道长约1000米&#xff0c;根据以往惯例&#xff0c;要求从UPS接电。 室外设备箱如图&#xff1a; 施工方从UPS接电后&#xff0c;直接接接线板&#xff0c;从接线板接两个220V-24V海康监控电源&#xff0c;电…

MySQL8高级

MySQL8高级 一、Linux下MySQL的安装与使用 1、版本说明 MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于大多数普通用户。MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;不能…

软件测试基础-自动化测试技术

今天跟大家分享软件测试基础&#xff0c;自动化测试技术&#xff0c;主要从引入自动化测试的原因、自动化测试的定义、自动化测试的优势、自动化测试的劣势、自动化测试的工具五个方面来讲述。 01 引入自动化测试的原因 软件规模越来越大&#xff0c;用户对软件的质量要求越来…

基于PHP+MYSQL药店会员管理系统的设计与实现

药房会员管理系统是信息时代的产物,随着时代的发展,各大药店也与时俱进使用了各类现代化的系统来进行各类药品和会员信息的管理,甚至有些药店会给会员使用积分系统,根据用户的消费进行积分,然后用积分兑换一些差用的日常用品或者药品,从而增加会员的黏度。 PHP&#xff1a;MYSQ…

[SpringMVC1]简介与快速入门案例详解

文章目录 一、SpringMVC简介 1.概述 2.三大模块 二、SpringMVC快速入门 1.准备工作 &#xff08;1&#xff09;新建Maven项目&#xff0c;选择webapp模板 &#xff08;2&#xff09;新增java源文件包 2.开始配置SpringMVC (1)在pom.xml中导入相关坐标以下载需要用到的依赖…

[附源码]计算机毕业设计JAVA鞋店销售管理

[附源码]计算机毕业设计JAVA鞋店销售管理 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

SpringBoot旅游网源码和论文java旅游管理系统

随着人们生活水平的不断提升&#xff0c;人们对旅游的需求越来越旺盛&#xff0c;对旅游产品 和服务的质量要求也越来越高。伴随着计算机技术、网络技术的不断普及与应用&#xff0c; 人们通过网络浏览旅游信息&#xff0c;预订旅游产品&#xff0c;交流旅游体验的活动越来越多…

AI生命科学绘图(4):质粒图谱的绘制

学习来源 &#xff1a;B站生信师兄 内容&#xff1a;质粒图谱绘制 质粒绘制思路 1.绘制俩个正圆轮廓&#xff0c;修改描边颜色和粗细 选择椭圆工具&#xff1a;按住shift绘制一个正圆&#xff0c;然后Alt拖动复制 拖动使得俩个圆重合 2.使用剪刀工具&#xff0c;修剪掉不需要…

[附源码]计算机毕业设计右脑开发教育课程管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

1 FPGA ZYBO Xilinx 按键控制LED灯 key_led

视频教程&#xff1a;第11.1讲 按键控制LED灯实验原理讲解_哔哩哔哩_bilibili 约束文件&#xff1a;digilent-xdc/Zybo-Master.xdc at master Digilent/digilent-xdc (github.com) 原理图&#xff1a;Zybo Z7 - Digilent Reference B 实验任务 使用ZYBO上的PL端按键&#…

AD域控服务器部署

AD服务器部署 一、主域控的部署&#xff08;主域控名2012DC1&#xff0c;ip192.168.15.1&#xff09;&#xff1a; 1、添加角色和功能向导 2、基于角色或基于功能的安装 3、从服务器池中选择服务器 4、选择Active Directory域服务 5、默认&#xff0c;下一步 6、默认&#xff0…

区间信息维护与查询【分块】 - 原理 分块详解

区间信息维护与查询【分块】 - 原理 分块详解 树状数组和线段树虽然非常方便&#xff0c;但维护的信息必须满足信息合并特性&#xff08;如区间可加、可减&#xff09;&#xff0c;若不满足此特性&#xff0c;则不可以使用树状数组和线段树。分块算法可以维护一些线段树维护不…

简单入门编写html登录界面

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>你好呀&#xff0c;登录吧</title><style&…

MySQL锁,锁的到底是什么

作者&#xff1a;蝉沐风 博客站点&#xff1a;https://www.chanmufeng.com 公众号&#xff1a;蝉沐风的码场 本文目录1. 资源的竞争方式2. 读—写/写—读下的问题2.1. 幻读2.2. 不可重复读2.3. 脏读2.4. 锁与MVCC的关系2.5. 锁与事务的关系3. 写—写情况4. 锁的粒度5. 锁的基本…

[附源码]计算机毕业设计JAVA校园失物招领管理系统

[附源码]计算机毕业设计JAVA校园失物招领管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…