DDD案例(2):从领域分析到代码实现(7)

简介: DDD案例(2):从领域分析到代码实现(7)

别业务服务规约的名词,可以获得领域概念:候选人(Candidate)、协调者(Coordinator)、培训(Training)、课程(Course)、票(Ticket)、候选名单(CandidateList)、票状态(TicketStatus)、邮件(Mail)。


别业务服务规约的动词,然后逐一检查该动词代表的领域行为是否需要产生过程数据。发现“提名候选人”,除了候选人获得培训票,还要记录票的变更历史,因而获得票历史(TicketHistory领域概念;发现“员工学习过课程”,需要记录该员工的学习记录,因而获得学习记录(Learning)领域概念。


对识别出来的领域概念进行归纳和抽象,发现CandidateList实际上是Candidate的集合,用List<Candidate>即可表达,没有必要单独引入;邮件通知由专门的OA集成上下文发送邮件,在培训上下文中没有必要列出,故而可以删去Mail概念。


于其他业务服务的领域分析建模,也如法炮制。由于培训上下文的业务服务皆位于同一个限界上下文,因而只需要考虑该上下文内部领域模型之间的关系。由此可获得图20-51所示的领域分析模型。


2.领域设计建模


领域设计建模牵涉两个重要的设计阶段:识别聚合和服务驱动设计。


1)识别聚合


首先梳理对象图。确定领域模型对象到底是实体还是值对象,并分别用不同的颜色表示。一些较容易识别的值对象可以最先标记出来,例如体现了单位、枚举、类型的内聚概念等,如图20-52所示。


image.png

image.png


一些容易识别的实体类也可以提前标记出来。这些实体类往往是业务服务中扮演主要作用的领域概念,体现了非常清晰的生命周期特征。


ProgramOwnerCoordinatorNomineeTrainee都是参与培训上下文的角色,都拥有员工上下文的员工ID,如此即可建立这些角色与TrainingTicket等实体类之间的关联。它们对应的角色(role)来自认证上下文,用于安全认证和权限控制。角色具有的基本信息,如姓名、电子邮件等,又来自员工上下文。因此,这些领域模型类虽然定义了ID,但在培训上下文中不过是其主实体的一个属性值而已,并不需要管理它们的生命周期,应该定义为值对象。由于培训上下文并未要求为培训维护一个单独的教师信息,故而与Training相关的Teacher应定义为值对象。


FilterValidDate都与Training关联。它们看似具有值对象的特征。对过滤器而言,只要TrainingId的值以及类型与规则相同,就应视为同一个Filter对象;有效日期也是如此,只要公式、日期和时间相同,就是同一个ValidDate对象。但是,由于它们的生命周期需要单独管理,将它们定义为实体更加适合。同理,ValidDateActionCancellingAction也需要单独管理生命周期,应定义为实体。TicketAction却不同,它的差异仅在于具体的活动内容,而它又不需要管理生命周期,应定义为值对象。于是,获得图20-53所示的领域设计类图。


image.png


在确定了值对象与实体后,可以简化对领域模型对象关系的确认,即只需梳理实体之间的关系。一个Course聚合了多个Training,一个Training聚合了多个Ticket,这三者之间的组合关系非常清晰。一个Training可以配置多个FilterValidDate,但它们之间并非必须有的关系,故而定义为OO聚合关系。同理,一个ValidDate聚合多个ValidDateAction、一个Ticket聚合多个CancellingAction和多个TicketHistory、一个Training聚合多个Candidate和多个Attendance,而BlackList则是完全独立的。确定了实体关系的领域设计类图如图20-54示。


image.png




相关文章
|
编译器 Shell Android开发
工具技能学习(一):前置技能-makfile、make、.mk
工具技能学习(一):前置技能-makfile、make、.mk
993 0
|
3月前
|
机器学习/深度学习 人工智能 Java
实测对比:企业落地的主流 AI 开发框架测评
本文以中立、客观、可落地为原则,实测对比JBoltAI、LangChain、Spring AI等主流AI框架,聚焦Java企业适配性、国产模型支持、工程化能力及存量系统改造难度,提供清晰选型建议。(239字)
265 0
|
6月前
FormatFactory_setup.exe 怎么用?完整安装与使用指南(新手必看)
FormatFactory_setup是格式工厂官方安装包,支持音视频、图片、文档等多格式转换,兼具剪辑、刻录功能。本文详解以管理员身份运行、自定义路径、规避捆绑软件等安装要点,并简述视频/音频/图片转换及合并操作,助你快速上手。(239字)
|
Go Python
函数的定义与调用 -《Go语言实战指南》
本文介绍了 Go 语言中函数的核心特性与用法,包括基本定义格式、调用方式、多返回值、返回值命名、参数类型简写、可变参数、高阶函数及匿名函数等内容。通过示例代码详细展示了如何定义和使用不同类型的函数,使读者能够全面了解 Go 函数的灵活性与强大功能。
294 12
|
Java
重磅!阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
阿里巴巴想全球Java开发者的重磅献礼!
6794 0
重磅!阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
|
存储 编解码 前端开发
前端 js 经典:字符编码详解
前端 js 经典:字符编码详解
551 0
|
Apache 项目管理 数据安全/隐私保护
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
375 0
substr与substring的区别
substr与substring的区别
KodBox可道云https一直转圈无法访问的处理
由于KodBox内部写死了请求连接,内连全是http造成无法https正常访问,后来调试发现域名的变量是API_HOST,这个变量是在config/config.php文件里面初始化的,只需要改成https连接就行。
559 0
|
.NET 数据库 开发框架
如何保存PDF、Word和Excel文件到数据库中
在项目中,有时候我们很需要把PDF、Word和Excel文档等等上传到数据库,以便日后使用。今天这篇文章向大家讲解如何将这些文件保存到数据库的。 详细步骤 第一步:打开数据库,单击新建查询,创建一个名称为Documents的表: 代码如下: create table Documents ( ...
7597 0