不少小伙伴在实践DDD领域驱动设计的时候,应该都有纠结过项目的结构应该如何设计。
经过实践,本人总结了一个比较实用的项目结构。今天就跟大家分享一下。

本文适合读者:

  1. 了解DDD领域驱动设计概念;
  2. DDD领域驱动设计实践中遇到难题;

1. 项目结构模块依赖关系:

模块依赖图:

项目的结构主要分为5个模块:
其中 用户接口层,应用层,领域层和基础设施层 的作用在这里就不做过多介绍了,通用工具层指的是自己团队的通用工具,是一些技术性的工具,不能包含有业务相关实现的工具类,但是,如果你的项目在开发过程中也需要编写一些技术通用的工具,那么就可以自己创建一个通用工具层。

2. 依赖关系介绍

从图中可以看出,用户接口层依赖应用层,应用层依赖领域层和基础设施层,领域层只依赖通用工具。

基础设施层比较特殊,除了依赖通用工具,还会依赖领域层。这个关系就是核心所在,领域层中只编写业务相关的代码逻辑,不包含任何的技术性的实现,当需要存储或者调用其他服务时,都是通过接口调用,而接口的实现在基础设置层,所以是基础设施层依赖领域层。这种依赖关系叫做依赖倒置

举个例子:
当一个订单领域在执行业务行为的过程中,需要获取历史订单数据,这个时候,通过调用 OrderRepository 接口的某个方法来获取的。而 OrderRepositoryImpl 接口的实现类实际在基础设施层。对于领域层来说,并不需要关心这些数据是怎么来的。

同时依赖基础设施层的还有应用层,如果说在实际的开发过程中,想要实现的功能只是简单的CRUD,那么完全可以直接调用基础设施层的数据存储实现,不需要经过领域层。如果只是为了依照规则通过领域层再去调用基础设施层,那这样就完全可以称为是过度设计,其实大可不必。

3. 实现示例

1 用包划分

2 使用Maven子模块划分

无论通过包划分还是Maven模块划分,从逻辑上讲都可以实现。但是这两种实现方式有一个区别,就是约束性的强弱不同。

通过包划分,虽然可以跟团队成员口头描述每个包之间的依赖关系,但是这个需要依靠每个开发者自己控制,如果开发者想要在领域层编写一些技术实现的代码,依然是可以的。

但是如果是Maven模块进行划分,就能在代码上进行约束了,领域层并没有依赖基础设施层,所以无法实现数据存储和查询等技术。

DDD-领域驱动设计包结构相关推荐

  1. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

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

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

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

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

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

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

  5. [转]浅析DDD(领域驱动设计)

    最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...

  6. 浅析DDD(领域驱动设计)

    最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...

  7. DDD 领域驱动设计落地实践:六步拆解 DDD

    引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...

  8. 从EF三层 到 DDD领域驱动设计(1)--------------数据操作

    前言: 一路走来,从单片机到C#,从电子行业到计算机行业,技术是不断提高,但是身体确不断变差,本来高新的工作也不得不辞掉,改到一家国企过着咸鱼般,但很爽的生活. 最近的金砖比较忙,刚忙完金砖的事,就有 ...

  9. 【DDD落地实践系列】DDD 领域驱动设计落地实践:六步拆解 DDD

    引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...

最新文章

  1. 了解因果论:从珀尔的《为什么》开始
  2. 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.01更新)
  3. shell实例第9讲:判断用户输入的是否为IP地址
  4. 数据结构树的基本操作_树的各类基本操作(数据结构)
  5. timeSetEvent、回调函数、CCriticalSection
  6. python切片是什么_python列表切片是什么
  7. TX2系统备份与恢复
  8. QQ登录pc端测试用例
  9. pdf转word乱码怎么办,可能是你没用对工具
  10. 三菱驱动器参数表_三菱伺服驱动器参数设置CM100TJ-24F
  11. 【数学建模】层次分析法(AHP)+Matlab实现
  12. 硬件入门之PCB设计注意事项
  13. dvi接口少4针_DVI接口针脚数量,详细图文资料介绍
  14. mysql进行创建序列化
  15. DFRobot高精度低功耗数字温湿度传感器SHT40
  16. 18种为你的网站引流的好方法
  17. Linux操作系统的设备独立性,Linux的设备管理
  18. word底纹怎么设置?2个小技巧任你挑选
  19. 哈哈哈!段子手们在家被迫营业,每一个都能笑到窒息!
  20. java计算机毕业设计ssm基于Vue的二手商品交易网站z40n1(附源码、数据库)

热门文章

  1. 教师管理系统代码html,江苏省教职工信息管理系统:https://www.jste.net.cn/cmsplus/index.html...
  2. win7系统如何提升电脑开机速度?
  3. iOS 开源图形库 Core Plot 使用教程
  4. Uber 叫车时,弹出以下代码导致无法打车(An email confirmation has been sent to...),解决办法...
  5. 【品牌DTC增长力】私域,你做的可能是“假的”
  6. 微信商户号 API 密钥、API 证书配置
  7. 拉丁超立方抽样 Latin hypercube sampling,java 代码
  8. Navicat Premium 用于增强您的数据库管理系统
  9. 功夫茶篇∞潮州工夫茶:通古今之变
  10. excel和mysql php_php和mysql仿excel的rank函数