DDD领域驱动设计:四层架构应用
文章目录
- 前言
- 一、DDD四层与传统三层区别
- 二、四层架构详解
- 1.分层作用
- 2.领域对象
- 三、编码实践
- 1.代码结构
- 四、常见问题
- 1.领域模型(充血模型)注入问题
- 结尾
前言
分层架构是运用最为广泛的一种架构模式,几乎每个软件系统都需要通过分层来隔离不同的关注点,以应对不同需求的变化,并且使得这种变化可以独立进行。 对于分层架构来说,层次越往上其抽象层次就越面向业务和用户,层次越往下其抽象层次就越面向技术和设备。
一、DDD四层与传统三层区别
我们常用的三层架构模型划分为表现层,业务逻辑层,数据访问层等,在DDD分层结构中既有联系又有区别,个人认为主要有如下异同:
在架构设计上,在DDD分层结构中将传统三层架构的业务逻辑层拆解为应用层和领域层
其中Application划分为很薄的一层服务,非核心的逻辑放到此层去实现,核心的业务逻辑表现下沉到领域层去实现,凝练为更为精确的业务规则集合,通过领域对象去阐述说明。
在建模方式上,DDD分层的建模思维方式有别于传统三层:
传统三层通常是以数据库为起点进行数据库分析设计,而DDD则需要以业务领域模型为核心建模(即面向对象建模方式),更能体现对现实世界的抽象。
故在DDD分层凸显领域层的重要作用,领域层为系统的核心,包括所有的业务领域模型的抽象表达。
在职责划分上,基础设施层涵盖两方面内容:
持久化功能,其中原三层架构的数据访问层下沉到基础设施层的持久化机制实现
通用技术支持,一些公共通用技术支持也放到基础设施层去实现。
二、四层架构详解
1.分层作用
分层 | 英文 | 描述 |
---|---|---|
表现层 | User Interface | 用户界面层,或者表现层,负责向用户显示解释用户命令 |
应用层 | Application Layer | 定义软件要完成的任务,并且指挥协调领域对象进行不同的操作。该层不包含业务领域知识。 |
领域层 | Domain Layer | 也可称为模型层,系统的核心,负责表达业务概念,业务状态信息以及业务规则。即包含了该领域(问题域)所有复杂的业务知识抽象和规则定义。该层主要精力要放在领域对象分析上,可以从实体,值对象,聚合(聚合根),领域服务,领域事件,仓储,工厂等方面入手 |
基础设施层 | Infrastructure Layer | 主要有2方面内容,一是为领域模型提供持久化机制,当软件需要持久化能力时候才需要进行规划;一是对其他层提供通用的技术支持能力,如消息通信,通用工具,配置等的实现; |
2.领域对象
类型 | 英文 | 描述 |
---|---|---|
值对象 | value object | 无唯一标识的简单对象 |
实体 | entity | 充血的领域模型,有唯一标识 |
聚合(聚合根) | aggregate | 实体的聚合,拥有聚合根,可为某一个实体 |
领域服务 | service | 无法归类到某个具体领域模型的行为 |
领域事件 | event | 不常用 |
仓储 | repository | 持久化相关,与基础设施层关联 |
工厂 | factory | 负责复杂对象创建 |
模块 | module | 子模块引入,可以理解为子域划分 |
三、编码实践
1.代码结构
├─com.company.microservice
│ │
│ ├─apis API接口层
│ │ ├─model 视图模型,数据模型定义 vo/dto(大多数情況是一样的)
│ │ ├─assembler 装配器,实现模型转换eg. apiModel<=> domainModel
│ │ └─controller 控制器,对外提供(Restful)接口
│ │
│ ├─application 应用层
│ │ ├─service 应用服务,非核心服务
│ │ ├─task 任务定义,协调领域模型
│ │ └─*** others
│ │
│ ├─domain 领域层
│ │ ├─common 公共代码抽取,限于领域层有效
│ │ ├─events 领域事件
│ │ ├─model 领域模型
│ │ │ ├─dict 领域划分的模块,可理解为子域划分
│ │ │ │ ├─DictVo.java 领域值对象
│ │ │ │ ├─DictEntity.java 领域实体,充血的领域模型,如本身的CRUD操作在此处
│ │ │ │ ├─DictAgg.java 领域聚合,通常表现为实体的聚合,需要有聚合根
│ │ │ │ └─DictService.java 领域服务,不能归与上述模型,如分页条件查询等可写在此处
│ │ │ ├─xxx
│ │ │ │ ├─xxxEntity.java
│ │ │ │ ├─bbbAgg.java
│ │ │ │ └─cccAgg.java
│ │ ├─service 领域服务类,一些不能归属某个具体领域模型的行为
│ │ └─factory 工厂类,负责复杂领域对象创建,封装细节
│ │
│ ├─infrastructure 基础设施层
│ │ ├─persistent 持久化机制
│ │ │ ├─po 持久化对象
│ │ │ └─repository 仓储类,持久化接口&实现,可与ORM映射框架结合
│ │ ├─general 通用技术支持,向其他层输出通用服务
│ │ │ ├─config 配置类
│ │ │ ├─toolkit 工具类
│ │ │ └─common 基础公共模块等
│ │
│ └─resources
│ ├─statics 静态资源
│ ├─template 系统页面
│ └─application.yml 全局配置文件
四、常见问题
1.领域模型(充血模型)注入问题
区别于传统的分层后,在domain中更多关注业务逻辑,考虑到要与spring框架集成,需要注意一个领域模型中注入的问题
在传统分层中,controller,service,repo均注册为spring管理的bean,但是在domain层中,service一部分的业务逻辑划分到了具体的领域对象中去实现了,显然这些对象却不能注册为单例bean,因此在此处不能沿用与原来分层结构中service层中通过@Autowired or @Resource等注入接口
关于这个问题,此处建议使用ApplicationContext实现
即通过一个工具类 ApplicationContextUtils 实现 ApplicationContextAware获取bean的方法,即 getBean()方法,然后我们就可以在我们的领域模型中直接应用该工具类来获取Spring托管的singleton对象,xxxRepo=ApplicationContextUtils.getBean(“xxxRepository”)
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
DDD领域驱动设计:四层架构应用相关推荐
- DDD领域驱动设计-分层架构实践
代码结构 项目是使用maven构建的springboot项目 基于DDD领域驱动分层架构设计,分为接口层interfaces.应用层application.领域层domain.基础设施代理层infra ...
- DDD领域驱动设计浅谈
DDD领域驱动设计是什么 1 DDD是什么? DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有17年. DDD名为:Domain Driven Design (领域驱动设计) ...
- DDD领域驱动设计-视频讲解+实战
目录 简介 解决的问题 过度耦合 现状 DDD的分层架构和构成要素 小结 分包应用 DDD领域驱动设计:实体.值对象.聚合根 DDD应用 战略建模 领域 限界上下文 需求分析 上下文映射图 战术建模- ...
- DDD(领域驱动设计)+SpringCloud的代码示例
一个微服务+DDD(领域驱动设计)的代码结构示例 </h1><div class="clear"></div><div class=&qu ...
- DDD 领域驱动设计落地实践系列:工程结构分层设计
引言 前面几篇文章中,笔者给大家阐述了 DDD 领域驱动设计的三大过程,重点围绕如何通过战略设计与战术设计进行 DDD 落地实践进行了详细的讨论,但是还没有涉及到工程层面的落地.实际上所有的这些架构理 ...
- DDD领域驱动设计落地实践系列:战略设计和战术设计
引言 通过前面的文章介绍,相信大家对于什么是DDD有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导.但是对于如何具体落地使用DDD, ...
- DDD 领域驱动设计落地实践系列:战略设计和战术设计
引言 通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等问题提供了方向和指导.但是对于如何具体落地使用 ...
- DDD领域驱动设计 — 贫血模型与充血模型
文章转载来源:https://juejin.cn/post/6917125801460629518 | 前言 要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念-- ...
- 一文理解 DDD 领域驱动设计!
来源丨SpringForAll社区 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Softwa ...
- DDD 领域驱动设计:贫血模型、充血模型的深入解读!
作者:JavaEdge在掘金 链接:https://juejin.cn/post/6917125801460629518 - 前言 - 要想深入掌握和了解 DDD 领域驱动设计的核心, ...
最新文章
- Hystrix框架设计与实现
- [WF4.0]工作流设计器Rehosting(一)
- 【XSY2719】prime 莫比乌斯反演
- 加载spring上下文的多种方式总结
- 【渝粤教育】 国家开放大学2020年春季 1068小企业管理 参考试题
- python—python2内置函数与python3内置函数总结
- 用 ANSYS/LS-DYNA 进行显式动力学仿真计算 (转帖,有修改)
- 采用QT进行OpenGL开发(三)着色器编程
- 轻量级Kubernetes之k3s:15:firewalld对应方法
- cv2.resize()
- 交换机上网显示本地未连接服务器,本地连接提示受限制或无连接,处理思路?...
- 数字孪生智慧城市信息化平台建设
- 基于SpringBoot+VUE的酒店管理信息系统的设计思路
- 数据结构和算法基础(4)——树
- 用Python写中文数字对照表
- java线程设计模式_JAVA多线程设计模式
- 加速新基建,优锘科技的数字孪生可视化运营平台迎来最好时代
- 【CAD二次开发】DrawJig绘制MLeader两种交互方式
- NIDS and HIDS
- ArcGIS在线应用介绍(5)Mosaic Pivot Viewer
热门文章
- 【图像融合】基于多模态实现CT图像无缝融合附matlab代码
- R语言—热力地图复合气泡饼图
- 如何使用CNN进行物体识别和分类_CNN 原理与实践指南
- 基于虚拟化的安全性怎么关闭,无法开启虚拟机!
- 在使用mac和windows双系统中常见的移动硬盘的格式
- Spring Boot Shiro原理系列
- sql查询按周查询出现的跨年问题
- ts 报错:‘new‘ expression, whose target lacks a construct signature, implicitly has an ‘any‘ type.
- 为什么下载小电影时,经常会卡在 99%?
- 一张图掌握产品经理绩效考核表实例