DDD-领域驱动设计包结构
不少小伙伴在实践DDD领域驱动设计的时候,应该都有纠结过项目的结构应该如何设计。
经过实践,本人总结了一个比较实用的项目结构。今天就跟大家分享一下。
本文适合读者:
- 了解DDD领域驱动设计概念;
- DDD领域驱动设计实践中遇到难题;
1. 项目结构模块依赖关系:
模块依赖图:
项目的结构主要分为5个模块:
其中 用户接口层,应用层,领域层和基础设施层 的作用在这里就不做过多介绍了,通用工具层指的是自己团队的通用工具,是一些技术性的工具,不能包含有业务相关实现的工具类,但是,如果你的项目在开发过程中也需要编写一些技术通用的工具,那么就可以自己创建一个通用工具层。
2. 依赖关系介绍
从图中可以看出,用户接口层依赖应用层,应用层依赖领域层和基础设施层,领域层只依赖通用工具。
而 基础设施层比较特殊,除了依赖通用工具,还会依赖领域层。这个关系就是核心所在,领域层中只编写业务相关的代码逻辑,不包含任何的技术性的实现,当需要存储或者调用其他服务时,都是通过接口调用,而接口的实现在基础设置层,所以是基础设施层依赖领域层。这种依赖关系叫做依赖倒置。
举个例子:
当一个订单领域在执行业务行为的过程中,需要获取历史订单数据,这个时候,通过调用 OrderRepository 接口的某个方法来获取的。而 OrderRepositoryImpl 接口的实现类实际在基础设施层。对于领域层来说,并不需要关心这些数据是怎么来的。
同时依赖基础设施层的还有应用层,如果说在实际的开发过程中,想要实现的功能只是简单的CRUD,那么完全可以直接调用基础设施层的数据存储实现,不需要经过领域层。如果只是为了依照规则通过领域层再去调用基础设施层,那这样就完全可以称为是过度设计,其实大可不必。
3. 实现示例
1 用包划分
2 使用Maven子模块划分
无论通过包划分还是Maven模块划分,从逻辑上讲都可以实现。但是这两种实现方式有一个区别,就是约束性的强弱不同。
通过包划分,虽然可以跟团队成员口头描述每个包之间的依赖关系,但是这个需要依靠每个开发者自己控制,如果开发者想要在领域层编写一些技术实现的代码,依然是可以的。
但是如果是Maven模块进行划分,就能在代码上进行约束了,领域层并没有依赖基础设施层,所以无法实现数据存储和查询等技术。
DDD-领域驱动设计包结构相关推荐
- C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...
- DDD领域驱动设计-视频讲解+实战
目录 简介 解决的问题 过度耦合 现状 DDD的分层架构和构成要素 小结 分包应用 DDD领域驱动设计:实体.值对象.聚合根 DDD应用 战略建模 领域 限界上下文 需求分析 上下文映射图 战术建模- ...
- DDD(领域驱动设计)+SpringCloud的代码示例
一个微服务+DDD(领域驱动设计)的代码结构示例 </h1><div class="clear"></div><div class=&qu ...
- DDD 领域驱动设计落地实践系列:工程结构分层设计
引言 前面几篇文章中,笔者给大家阐述了 DDD 领域驱动设计的三大过程,重点围绕如何通过战略设计与战术设计进行 DDD 落地实践进行了详细的讨论,但是还没有涉及到工程层面的落地.实际上所有的这些架构理 ...
- [转]浅析DDD(领域驱动设计)
最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...
- 浅析DDD(领域驱动设计)
最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...
- DDD 领域驱动设计落地实践:六步拆解 DDD
引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...
- 从EF三层 到 DDD领域驱动设计(1)--------------数据操作
前言: 一路走来,从单片机到C#,从电子行业到计算机行业,技术是不断提高,但是身体确不断变差,本来高新的工作也不得不辞掉,改到一家国企过着咸鱼般,但很爽的生活. 最近的金砖比较忙,刚忙完金砖的事,就有 ...
- 【DDD落地实践系列】DDD 领域驱动设计落地实践:六步拆解 DDD
引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...
最新文章
- 了解因果论:从珀尔的《为什么》开始
- 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.01更新)
- shell实例第9讲:判断用户输入的是否为IP地址
- 数据结构树的基本操作_树的各类基本操作(数据结构)
- timeSetEvent、回调函数、CCriticalSection
- python切片是什么_python列表切片是什么
- TX2系统备份与恢复
- QQ登录pc端测试用例
- pdf转word乱码怎么办,可能是你没用对工具
- 三菱驱动器参数表_三菱伺服驱动器参数设置CM100TJ-24F
- 【数学建模】层次分析法(AHP)+Matlab实现
- 硬件入门之PCB设计注意事项
- dvi接口少4针_DVI接口针脚数量,详细图文资料介绍
- mysql进行创建序列化
- DFRobot高精度低功耗数字温湿度传感器SHT40
- 18种为你的网站引流的好方法
- Linux操作系统的设备独立性,Linux的设备管理
- word底纹怎么设置?2个小技巧任你挑选
- 哈哈哈!段子手们在家被迫营业,每一个都能笑到窒息!
- java计算机毕业设计ssm基于Vue的二手商品交易网站z40n1(附源码、数据库)
热门文章
- 教师管理系统代码html,江苏省教职工信息管理系统:https://www.jste.net.cn/cmsplus/index.html...
- win7系统如何提升电脑开机速度?
- iOS 开源图形库 Core Plot 使用教程
- Uber 叫车时,弹出以下代码导致无法打车(An email confirmation has been sent to...),解决办法...
- 【品牌DTC增长力】私域,你做的可能是“假的”
- 微信商户号 API 密钥、API 证书配置
- 拉丁超立方抽样 Latin hypercube sampling,java 代码
- Navicat Premium 用于增强您的数据库管理系统
- 功夫茶篇∞潮州工夫茶:通古今之变
- excel和mysql php_php和mysql仿excel的rank函数