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

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

6)应用边界的识别


对应用边界的识别,就是从技术维度考量限界上下文,包括考虑系统的质量属性、模块的复用性、对需求变化的应对和处理遗留系统的集成等。


们与客户决策层一起确认了报表功能的需求,客户希望统计报表能够准确及时地展现历史和当前的人才供需情况。统计报表功能直接影响了目标系统的愿景,是系统的核心功能之一,需要花费更多精力来明确设计方案。通观与统计报表有关的业务服务,除了与职能部门管理工作有关的统计日报、周报和月报,报表的统计结果实际上为集团领导进行决策提供了数据层面的辅助支持。要提供准确的数据统计,就需要对市场需求、客户需求、项目、员工、储备人才、招聘活动等数据做整体分析,也就需要整个系统核心限界上下文的数据支持。倘若EAS的每个限界上下文并未采用微服务这种零共享架构,整个系统的数据就可以存储在一个数据库中,无须进行数据的采集和同步即可支持统计分析。另一种选择是引入数据仓库,采用诸如ETL等形式完成对各个生产数据库和日志文件的采集,经过统一的数据治理后为统计分析提供数据支持。


在分析工作边界时,我考虑到报表上下文与其他限界上下文之间存在强依赖关系,无法支持并行开发,因而将该上下文的功能按照业务相关性分配给其他限界上下文。如今,通过技术分析得知,虽然依赖仍然存在,但该上下文更多地体现了决策分析的特定领域。最终,我决定保留该限界上下文,并将其更名为决策分析上下文。


考虑通知上下文的实现时,基于之前确定的系统上下文,EAS系统要与集团现有的OA系统集成。我们了解了OA系统公开的服务接口,发现这些接口已经提供了多种消息通知功能,包括站内消息、邮件通知和短消息通知,没有必要在EAS系统中重复开发通知功能。那么,通知上下文是否就没有存在的必要呢?一旦去掉通知上下文,与OA系统集成的功能又该放在哪里?领域驱动设计建议将这种与第三方服务集成的功能放在防腐层,可EAS系统中的多个限界上下文都需要调用该功能,会形成防腐层的重复建设。为了满足功能的复用性,可以为它单独创建一个限界上下文。为了说明其意图,将它更名为OA集成上下文。


最终,得到图20-41所示的限界上下文。


image.png


3.上下文映射


确定了目标系统的限界上下文之后,即可通过业务服务获得的服务序列图确定限界上下文之间的协作关系,从而确定上下文映射模式,设计出服务契约。


1)创建市场需求


创建市场需求业务服务属于订单上下文,它拥有的领域知识已经足以满足该业务服务的需求,无须求助于其他的限界上下文,因此在本务服务中,没有上下文映射。服务序列图如图20-42所示。


image.png


虽然创建市场需求没有多个限界上下文参与协作,但为其绘制服务序列图仍有必要,因为可以通过它驱动出创建市场需求的服务契约。


2)归档合同


归档合同业务服务属于合同上下文,具备合同相关的领域知识,但不具备上传文件的业务能力,需要求助于文件共享上下文,服务序列图如图20-43所示。


文件共享上下文作为支撑子领域的限界上下文,主要提供了文件上传与下载的功能。它具有的领域知识还包括针对不同类型的文档维护了服务器文件存储的路径映射,故而参与协作的是北向网关的应用服务。形成的上下文映射图如图20-44所示。


image.png


3)添加项目成员


添加项目成员业务服务属于项目上下文,拥有与项目相关的所有领域知识和业务能力,但并不具备发送通知的业务能力,也不知道该如何将当前项目的信息添加到员工的项目经验中,因此需要分别求助于OA集成上下文和员工上下文。服务序列图如图20-45所示。


image.png


OA集成上下文要实现的功能都与通知有关。无论是短信通知、邮件通知还是站内通知,都没有副作用,且允许以异步形式调用,适合使用事件的调用机制,因而为其选择发布者/订阅者模式。选择该模式既可以解除OA集成上下文与大多数限界上下文之间的耦合,又能较好地保证EAS系统的响应速度,减轻主应用服务器的压力。不足是需要增加一台部署消息队列的服务器,并在一定程度增加了架构的复杂度。如图20-45所示,项目管理者在添加了项目成员之后,会向事件总线发布TeamMemberAdded应用事件,并由OA集成上下文的事件订阅者订阅该事件。形成的上下文映射图如图20-46所示。


为主要的业务服务绘制服务序列图,深层次地思考各个限界上下文如何参与到每个业务服务、它们又该如何协作、应该采用什么样的上下文映射模式,就可以得到整个EAS系统的上下文映射图,如图20-47所示。


image.png


上下文映射图不仅说明了限界上下文之间的协作关系、彼此间采用的团队协作模式,也可以作为服务契约设计的参考和补充。



相关文章
|
监控 安全 Linux
CentOS7下部署ARL资产侦察灯塔系统
CentOS7下部署ARL资产侦察灯塔系统
1715 3
基于PID控制器的异步电机矢量控制系统simulink建模与仿真
本课题研究基于PID控制器的异步电机矢量控制系统,利用Simulink建立仿真模型,分析系统在不同工况下的运行性能。通过矢量控制技术实现对电机转速和转矩的高精度调节,验证了PID控制器在系统中的良好控制效果,提升了异步电机的稳定性和响应性,具有较强的工程应用价值。
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。
|
Ubuntu Linux 网络安全
/var/log/auth.log日志详解
`/var/log/auth.log`是Linux(尤其是Debian系如Ubuntu)记录身份验证和授权事件的日志文件,包括登录尝试(成功或失败)、SSH活动、sudo使用和PAM模块的操作。登录失败、SSH连接、sudo命令及其它认证活动都会在此记录。查看此日志通常需root权限,可使用`tail`、`less`或`grep`命令。文件内容可能因发行版和配置而异。例如,`sudo tail /var/log/auth.log`显示最后几行,`sudo grep "failed password" /var/log/auth.log`搜索失败密码尝试。
2479 8
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
2179 4
|
数据采集 人工智能 监控
Spring Boot项目中集成Spring AI(也就是Spring Artificial Intelligence)
Spring Boot项目中集成Spring AI(也就是Spring Artificial Intelligence)
6085 1
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
47972 6
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1608 0
|
存储 Unix C语言
STM32--RTC实时时钟
STM32--RTC实时时钟
868 0
|
Python
Nuitka打包二、命令总结
Nuitka打包exe工具,基本命令
3602 0