笔记篇-关于DDD的相关笔记

image.png

背景

何为复杂

  • 业务复杂不易实现,牵扯的范围广,系统的各个模块非常庞大
  • 变更复杂,耦合度高一旦变更将会影响整个系统,同时带了的风险高,时间成本高

介绍

领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

业务对象模型(也叫领域模型domain model)是描述业务用例实现的对象模型。它是对业务角色和业务实体之间应该如何联系和协作以执行业务的一种抽象。业务对象模型从业务角色内部的观点定义了业务用例。该模型为产生预期效果确定了业务人员以及他们处理和使用的对象(“业务类和对象”)之间应该具有的静态和动态关系。它注重业务中承担的角色及其当前职责。这些模型类的对象组合在一起可以执行所有的业务用例。

  • 失血模型:简单来说,就是domain object只有属性的getter/setter方法,没有任何业务逻辑。
  • 贫血模型:domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。Service(业务逻辑,事务封装) –> DAO –> domain object
  • 充血模型:认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。Service(事务封装) —> domain object <—> DAO
  • 胀血模型
    基于充血模型的缺点,有同学提出,干脆取消Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。domain object(事务封装,业务逻辑) <—> DAO
    似乎ruby on rails就是这种模型,他甚至把domain object和DAO都合并了。

分层

image.png

用户界面/展现层

负责向用户展现信息以及解释用户命令。更细的方面来讲就是:

  1. 请求应用层以获取用户所需要展现的数据;
  2. 发送命令给应用层要求其执行某个用户命令;

应用层

很薄的一层,定义软件要完成的所有任务。对外为展现层提供各种应用功能(包括查询或命令),对内调用领域层(领域对象或领域服务)完成各种业务逻辑,应用层不包含业务逻辑。

领域层

负责表达业务概念,业务状态信息以及业务规则,领域模型处于这一层,是业务软件的核心。

基础设施层

本层为其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基础设施层可以通过架构和框架来支持其他层的技术需求;

image.png

细分

层次 说明
controller 提供服务的访问层,目前采用RestController的方式,也做基础数据格式校验的业务。
service 对应上图中的services部分,主要做4类事情:1、开启事务与事务消息,2、适配并调用Executor层,3、业务拓展,4、多个Executor的编排组装。
convertor 适配层,适配层的存在也是为了避免各层次间的强依赖,为了更清新的划分清楚层次,如command对象将不直接依赖vo对象,而是通过convertor或构造数据做适配
executor 具体业务命令的逻辑编排与执行,这是业务逻辑处理的关键地方,遵循CQRS分为Command与Query,executor是资源层的操控者。
extension 业务扩展层,可扩展多种业务实现,COLA提供了全局的策略规范。extension会在service层被调用
domain 洋葱图的核心部分:领域层,domain领域可细分为model与service(action)
event event在架构图中属于资源层,event作为解耦系统的耦合度起到了非常关键的作用,同时也为解决事务问题提供了标准
pojo 数据dto对象,分为command/vo/co/ao… 等不同的dto对象
repository 资源层相对来说比较广泛,最基本的是对db的操作,对其他模块的操作(feign),对搜索引擎或消息队列的操作都属于资源。可细分为:feign、db、search、message

资料

cola: https://github.com/alibaba/COLA
springboot-ddd-demo: https://github.com/1991wangliang/springboot-ddd-demo
DDD的基础理论: https://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html
运用四色建模法进行领域分析: https://www.infoq.cn/article/xh-four-color-modeling/
领域模型的概念:https://www.oschina.net/question/12_21641
领域驱动设计和CQRS落地:https://mp.weixin.qq.com/s/R-jBnPhWJHs7J-4CETV88A
领域模型、贫血模型、充血模型概念总结:https://www.cnblogs.com/duanxz/p/9922170.html


笔记篇-关于DDD的相关笔记
https://mikeygithub.github.io/2021/09/20/yuque/笔记篇-关于DDD的相关笔记/
作者
Mikey
发布于
2021年9月20日
许可协议