文章目录

  • 前言
  • 一、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领域驱动设计:四层架构应用相关推荐

  1. DDD领域驱动设计-分层架构实践

    代码结构 项目是使用maven构建的springboot项目 基于DDD领域驱动分层架构设计,分为接口层interfaces.应用层application.领域层domain.基础设施代理层infra ...

  2. DDD领域驱动设计浅谈

    DDD领域驱动设计是什么 1 DDD是什么? DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有17年. DDD名为:Domain Driven Design (领域驱动设计) ...

  3. DDD领域驱动设计-视频讲解+实战

    目录 简介 解决的问题 过度耦合 现状 DDD的分层架构和构成要素 小结 分包应用 DDD领域驱动设计:实体.值对象.聚合根 DDD应用 战略建模 领域 限界上下文 需求分析 上下文映射图 战术建模- ...

  4. DDD(领域驱动设计)+SpringCloud的代码示例

    一个微服务+DDD(领域驱动设计)的代码结构示例 </h1><div class="clear"></div><div class=&qu ...

  5. DDD 领域驱动设计落地实践系列:工程结构分层设计

    引言 前面几篇文章中,笔者给大家阐述了 DDD 领域驱动设计的三大过程,重点围绕如何通过战略设计与战术设计进行 DDD 落地实践进行了详细的讨论,但是还没有涉及到工程层面的落地.实际上所有的这些架构理 ...

  6. DDD领域驱动设计落地实践系列:战略设计和战术设计

    引言 通过前面的文章介绍,相信大家对于什么是DDD有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导.但是对于如何具体落地使用DDD, ...

  7. DDD 领域驱动设计落地实践系列:战略设计和战术设计

    引言 通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等问题提供了方向和指导.但是对于如何具体落地使用 ...

  8. DDD领域驱动设计 — 贫血模型与充血模型

    文章转载来源:https://juejin.cn/post/6917125801460629518 | 前言  要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念-- ...

  9. 一文理解 DDD 领域驱动设计!

    来源丨SpringForAll社区 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Softwa ...

  10. DDD 领域驱动设计:贫血模型、充血模型的深入解读!

    作者:JavaEdge在掘金 链接:https://juejin.cn/post/6917125801460629518 -     前言     - 要想深入掌握和了解 DDD 领域驱动设计的核心, ...

最新文章

  1. Hystrix框架设计与实现
  2. [WF4.0]工作流设计器Rehosting(一)
  3. 【XSY2719】prime 莫比乌斯反演
  4. 加载spring上下文的多种方式总结
  5. 【渝粤教育】 国家开放大学2020年春季 1068小企业管理 参考试题
  6. python—python2内置函数与python3内置函数总结
  7. 用 ANSYS/LS-DYNA 进行显式动力学仿真计算 (转帖,有修改)
  8. 采用QT进行OpenGL开发(三)着色器编程
  9. 轻量级Kubernetes之k3s:15:firewalld对应方法
  10. cv2.resize()
  11. 交换机上网显示本地未连接服务器,本地连接提示受限制或无连接,处理思路?...
  12. 数字孪生智慧城市信息化平台建设
  13. 基于SpringBoot+VUE的酒店管理信息系统的设计思路
  14. 数据结构和算法基础(4)——树
  15. 用Python写中文数字对照表
  16. java线程设计模式_JAVA多线程设计模式
  17. 加速新基建,优锘科技的数字孪生可视化运营平台迎来最好时代
  18. 【CAD二次开发】DrawJig绘制MLeader两种交互方式
  19. NIDS and HIDS
  20. ArcGIS在线应用介绍(5)Mosaic Pivot Viewer

热门文章

  1. 【图像融合】基于多模态实现CT图像无缝融合附matlab代码
  2. R语言—热力地图复合气泡饼图
  3. 如何使用CNN进行物体识别和分类_CNN 原理与实践指南
  4. 基于虚拟化的安全性怎么关闭,无法开启虚拟机!
  5. 在使用mac和windows双系统中常见的移动硬盘的格式
  6. Spring Boot Shiro原理系列
  7. sql查询按周查询出现的跨年问题
  8. ts 报错:‘new‘ expression, whose target lacks a construct signature, implicitly has an ‘any‘ type.
  9. 为什么下载小电影时,经常会卡在 99%?
  10. 一张图掌握产品经理绩效考核表实例