领域驱动设计(DDD):项目目录(包、模块)结构

领域驱动设计(DDD):项⽬⽬录(包、模块)结构
项⽬⽬录(包、模块)结构
在项⽬的开发阶段,⽬录结构的划分往往被看做是迈向成功的第⼀步。这⼀步的迈出往往伴随着很多⽅⾯的权衡(考量),总的来说是两个⽅⾯的考量:业务⽅⾯和技术⽅⾯。
业务⽅⾯的考量包括:限界上下⽂、⼦域、业务模块。
技术⽅⾯的考量包括:软件架构分层架构、六边形架构)、构造型分类。
⽬录结构构成
常见的项⽬的⽬录结构基本上由:领域名(domain)、层名(layer)、构造型名(stereotype)、业务模块名(module)这四个部分组成。
领域(业务域、⼦域)名称
在《领域驱动设计》中的领域通常是指⼀个业务域,是⼀个特定的业务范围。同类项⽬中的业务可能雷同,但对于⼤多数的项⽬要解决的业务(问题)来说不会超出所在业务域的范围,因此在项⽬的⽬录(
包、模块)结构中包含业务域的名称能起到限界作⽤。⽐如:产品⽬录⼦域(Catalog)、订单⼦域(Order)、物流⼦域(Shipping)、发票⼦域(Invoice)等等。
分层架构中层次名称
在项⽬的⽬录结构中显式的引⼊层名是⼀种技术考量,更具体⼀些是编码的考量。分层架构是⼀种从混乱到有序的解决⽅案(架构模式)。它的做法是将⼀个应⽤程序(流程)划分为多组⼦任务,其中每组⼦任务都位于特定抽象层中。例如:分层架构在应⽤系统的后端开发中,常将⼀个应⽤系统划分为三层架构或者四层架构。
三层架构:
表现层(Presentation)
业务逻辑层(Business)
持久层(Persistence)
四层架构:
表现层(Presentation)
应⽤(逻辑)层(Application)
领域层(Domain)
基础设施层(Infrastructure)
在四层架构中的基础设施层要⽐三层架构中的持久层的功能多⼀些。
在应⽤系统开发中的分层架构并不是严格意义上的分层架构。真正的分层表⽰为上层只能依赖下层,是单向依赖,不能存在双向依赖。具体来说有以下特点:
J 层依赖 J - 1 层,J + 1 层依赖 J 层。
J - 1 层不会依赖 J 层,J 层也不会依赖 J + 1 层。
envision法J + 1 层也不会依赖 J - 1 层。
层与层之间通过数据的封装、转换或者直接使⽤来做到隔离。
在追求性能和灵活性⽅⾯,出现了两种分层变种:宽松的分层系统(Relaxed Layered System)和通过继承进⾏分层(Layering Through Inheritance)。我们将简要讨论宽松的分层系统,因为普遍地应
⽤系统采⽤的就是宽松的分层系统。
宽松的分层系统表⽰:每层都可以使⽤它的下层服务,⽽不仅仅是下⼀层的服务。每层都可能是半透明的,这意味着有些服务只对上⼀层可见,⽽有些服务对上⾯的所有层都可见。
就算是严格地分层架构或者宽松的分层架构,都表明是上层依赖下层。但在实际地应⽤系统的架构中并没有完全遵循这种依赖关系,因为架构⼈员需要在整体架构与分层架构之间进⾏摇摆球式思考。⽐如:在领域(Domain)层中的 Repository 接⼝的实现类往往会放在基础设施(Infrastructure)层中,这显然违反了分层架构中的单向依赖关系。这样的问题有两种解决⽅案:⼀是诚然接受。⼆是将领域层中的Repository 接⼝的实现类放置在领域层内。
构造型名称(stereotype)
构造型使⽤书名号(<<>>)来表⽰,⽤于区分不同地建模元素。
如:实体(entity)、枚举(enumeration)、异常(exception)、查询(query)、事件(event)、资源库(repository)、服务(service)、控制器(controller)等等都是常见的构造型。
补充:在 UML1.4 及以后版本允许⼀个建模元素可以附加多个构造型。
有些项⽬在划分项⽬的⽬录结构时,会将构造型显式的引⼊到⽬录(包)结构中,这是⼀种归类的组织⽅式。
业务模块名称(module)
在分析⼀个业务(问题)域时,会将⼀个业务域划分为多个业务模块。⽐如在商店(Store)⼦域中会被划分为:商店员⼯(Staff)、商店会员(Member)、商店⾓⾊(Role)等等。
⽬录结构分类
在分别对⽬录(包)结构的构成元素做了简单介绍后,下⾯要开始具体探讨由这些元素组合⽽成的⽬录结构了。
业务域名.层名.*
业务域名.层名.业务模块名.*
业务域名.构造型名.*
业务域名.构造型名.业务模块名.*
业务域名.(层名 & 构造型名).*
业务域名.(层名 & 构造型名).业务模块名.*
业务域名.业务模块名.*
业务域名.业务模块名.层名.*
业务域名.业务模块名.构造型名.*
业务域名.业务模块名.(层名 & 构造型名).*
业务域名.(业务模块名 & 层名 & 构造型名).*
(构造型名 || 层名).业务域名.业务模块名.*
补充说明:
省略包(package)的反向域名(org.mallfoundry.*)前缀的部分。
领域看作是业务域,其中业务域名是业务域名,⽽不是业务域名。
(层名 & 构造型名)是⼀种混合,表⽰在同⼀级别的⽬录(包)结构上同时存在按层和按构造型划分的两种⽅式。⽬录结构:业务域名.层名.*
├─catalog            // 商品⽬录⼦域
│├─application
│├─domain
│├─infrastructure
│└─presentation
├─order              // 订单⼦域
│├─application
│├─domain
│├─infrastructure
│└─presentation
└─store              // 商家⼦域
├─application
├─domain
├─infrastructure
给孩子适宜的爱
└─presentation
业务域名.层名.业务模块名.*
├─catalog            // 商品⽬录⼦域
│├─application        // 应⽤层
││├─brand
││├─category
││├─collection
││└─product
│├─domain            // 领域层
││├─brand              // 商品品牌模块
││├─category            // 商品类⽬模块
││├─collection          // 商品集合模块
││└─product            // 商品模块
│├─infrastructure    // 基础设施层
││└─persistent          // 持久化
││├─jpa
││├─mybatis
││└─redis
│└─presentation      // 表现层
│├─graphql
│├─grpc
│├─rest
│├─view
│└─websocket
└─order
├─application
│├─dispute
│├─review
│├─shipping
│└─source
├─domain
│├─dispute
│├─review
│├─shipping
│└─source
├─infrastructure
└─presentation
业务域名.构造型名.*
├─catalog
│├─controller
│├─exception
│├─model
│├─query
│├─repository
│└─service
└─order
├─controller
├─exception
├─model
├─query
├─repository
└─service
备注:
Model 包中中包含:实体、值对象、枚举等领域模型。在有些项⽬中会将 Model 包命名为:Pojo、Bean、Entity 等。
在按构造型划分⽬录时还会存在:DTO、VO 等包结构。
业务域名.构造型名.业务模块名.*
├─catalog
│├─controllers
││├─brand
││├─category
││├─collection
││└─product
│├─exceptions
││├─brand
││├─category
││├─collection
││└─product
│├─models
││├─brand
││├─category
││├─collection
││└─product
│├─queries
││├─brand
││├─category
││├─collection
││└─product
│├─repositories
││├─brand
││├─category
││├─collection
││└─product
│└─services
│├─brand
钨铜电触头
│├─category
│├─collection
│└─product
└─order
├─controllers
├─exceptions
├─models
├─queries
├─repositories
└─services
备注:在采⽤这种⽬录结构时,构造型名称常采⽤复数形式命名。
业务域名.(层名 & 构造型名).*
├─catalog
│├─controller
│├─dao
│├─exception
│├─model
│├─query
│└─service
└─order
├─controller
├─dao
├─exception
├─model
├─query
└─service
备注:在⽬录(包)结构中采⽤(层名 & 构造型名)混合式的⽅式,常常出现在将分层架构与构造型混淆在⼀起的项⽬中。
Controller 代表表现层。
Service 代表业务逻辑层。
Dao 或者 Repository 代表数据访问层。
Model 代表领域模型。
业务域名.(层名 & 构造型名).业务模块名.*
├─catalog
under age10 years old│├─controller
││├─brand
││├─category
事件监控││├─collection
││└─product
│├─dao
││├─brand
││├─category
││├─collection
││└─product项链的主人公
│├─exception
││├─brand
││├─category
││├─collection
││└─product
│├─model
││├─brand
││├─category
││├─collection
││└─product
│├─query
││├─brand
││├─category
││├─collection
││└─product
│└─service
│├─brand
│├─category
│├─collection
│└─product
└─order
├─controller
├─dao
├─exception
├─model
├─query
└─service
业务域名.业务模块名.*
├─catalog
│├─brand
│├─category
│├─collection
│└─product
└─order
├─dispute
├─review
├─shipping
└─source
业务域名.业务模块名.层名.*
├─catalog
│├─brand
││├─application
││├─domain
││├─infrastructure
││└─presentation
│├─category
││├─application
││├─domain
││├─infrastructure
││└─presentation
│├─collection
││├─application
││├─domain
││├─infrastructure
││└─presentation
│└─product
│├─application

本文发布于:2024-09-22 03:40:53,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/109445.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:业务   架构   分层   域名   模块   构造型   依赖
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议