领域驱动设计实践框架-COLA的解读
引言
Cola作为当前比较优秀的领域驱动设计最佳实践框架越来越被更多的技术人所知晓。先抛出COLA 4.0:应用架构的最佳实践_张建飞(Frank)的博客-CSDN博客_cola架构 是关于COLA4.0最新的内容介绍。然后个人对于读了这篇文章后,对于其中的架构理念和其中的各组件的设计加了一点个人解读来分享。
主要分为两部分来进行分析,一个架构,一个组件。架构主要想分析他的分层结构对于我们做技术架构设计和模块划分有的指导意义。组件主要就是对于一些编程的方法来解耦业务的最佳方法论。
COLA架构解析
下图转载 COLA 4.0:应用架构的最佳实践_张建飞(Frank)的博客-CSDN博客_cola架构
垂直拆分
从上往下分别有
- VO:ViewObject 视图 也就是给用户看的数据,也称为Controller层
- DTO: DomainTransferObject 领域转化对象 也就是领域对象转换后的对象,也称为Service层
- Entity: Entity 实体 也就是代表具体有行为的实际对象,也成为Domain层
- DO: DomainObject 领域对象,也就是领域对象,基础设施层
为什么会产生这样的分层呢?我从最原始的时候开始说明,解说这个演变过程。
最早的时候还是单体服务时候,也没有领域概念,有DAO层,实体层,服务(Service)层,控制(Controller)层,视图(View)层。后来为了提升开发效率,展示层和逻辑彻底分离,就有了前后端分离的技术,就弱化了视图层。只有控制层,形成统一的MVC架构。
后来业务发展越来越多样化,视图层对于数据结构的需求越来越多,为了响应这种变化,同时保持业务的扩展性,就得在视图层和实体层增加一层数据转化层,用来应对各种各样的场景下的视图,就形成了DAO层,实体层,DTO层,服务(Service)层,控制(Controller)层。
紧接着互联网进一步发展,业务进一步扩大,单体服务已经不能满足需求,就有了微服务。这时候服务的能力就进而被拆分成多层,有聚合层和基础服务层。此时分层服务层需求还可以满足,但是聚合层的话就难以清晰的表达了。因为聚合层可能会涉及到多个也业务域,而不同的业务域对于聚合层来讲又不能是实体层,也不能是服务层。因为如果实体层,聚合服务内的领域边界就很难清晰。如果是服务层,那么聚合服务的本身的服务层就被污染了。所以很多微服务的框架引入了一个Model层,他直接在聚合层把不同业务域分在不同的Model里面。不过此方案对于开发工作者来说有较高的要求,需要他能很好的了解领域划分。
后来就进行了领域驱动设计,这个要满足的就是以领域驱动,还有就是编程思想的转变,以充血模型替代原来的贫血模型。他认为对象除了有属性职位还应该有行为,有动作,从而达到完整的对象的目的。属性和行为密不可分的。所以将实体层和DAO层整合到一起形成基础设施层。当从基础设施完成了对象的构造之后就形成了领域层,就是领域对象。实体层同时也需要定义对象的实际行为,基本的增删改查等等。DTO层保留,控制层和视图层也保留。但是这个时候DTO虽然依然是进行数据转化,但是他是严格遵循业务过程中领域上下文(AddCustomerCmd)的数据转化。
@Extension(bizId = Constants.BIZ_1)
public class CustomerBizOneConvertorExt implements CustomerConvertorExtPt {@Autowiredprivate CustomerConvertor customerConvertor;//Composite basic convertor to do basic conversion@Overridepublic CustomerEntity clientToEntity(AddCustomerCmd addCustomerCmd){CustomerEntity customerEntity = customerConvertor.clientToEntity(addCustomerCmd);CustomerDTO customerDTO =addCustomerCmd.getCustomerDTO();//In this business, AD and RFQ are regarded as different sourceif(Constants.SOURCE_AD.equals(customerDTO.getSource())){customerEntity.setSourceType(SourceType.AD);}if (Constants.SOURCE_RFQ.equals(customerDTO.getSource())){customerEntity.setSourceType(SourceType.RFQ);}return customerEntity;}
}
此时的各个层之间的交互数据不再是对象或者其他,而只能是有领域边界定义的限界上下文。领域的划分和限界上下文的定义,请参考 猿创征文|微服务架构领域驱动设计(DDD)_剑飞的编程思维的博客-CSDN博客_微服务拆分 领域驱动设计
水平拆分
从左往右分别有
- VO:手机端,小程序端,浏览器端,消息,调度任务
- DTO: 服务,执行器
- Entity: 接口,模块,能力
- DO: 接口实现,仓库,配置
水平拆分的目的是在于在同一个逻辑层次,由于应用域不一样,使用的方法差别比较大,比如手机端和小程序端返回的数据差别和功能迭代差别较大,所以需要拆分到不同的类别。再就是执行器和服务,服务完成了功能,但是有时候再执行服务的时候可能会有相关联的业务操作,这个时候需要用执行器包装,但是他要跟服务解耦,所以要拆分。防腐层,模块和能力都是根据具体的业务做的一个划分,主要是是根据职责划分。践行单一职责原则,迪米特法则。
COLA组件
组件解决是是我们再日常开发服务中经常要用到的一些功能,封装后我们可以直接复用。同时也是可以规范我们的开发能力,不会导致代码风格混乱,从而提升开发效率。
Catchlog组件
通过定义切面,对于请求处理前后,进行日志打印,接口监控。同时定义响应体的统一处理接口,为统一处理提供一个可扩展点
Domain组件
通过多例模式,实现了充血模型的开发。为什么要用多例?首先Spring的创建的Bean模式单例的,然后充血模型的实例中是有属性的,那么他的行为只能在当前线程中安全,如果是单例,那么线程不安全,所以必须要是多例模式。应用了工厂模式生成多例。
DTO组件
定义数据转换的基本结构,父类ClientObject,Command,Response,DTO等等,扩展点名称等统一定义父类,形成多态,定义转化数据的基本规范和职责
Exception组件
定义服务中的异常,系统异常,业务异常,检查异常
Extention组件
扩展点的定义以及组装,通过函数接口,提取出扩展点,如图
函数接口,以及starter组装,扩展点的适配缓存都是较好的编程风格
StateMachine组件
这个状态机的核心思想就是把一些状态流程,流程化的开发通过定义全局结构,实现逻辑和代码的接口。核心的就是泛型的使用,状态流转的对象就是变更前,变更后,然后上下文主要对象。
除了以上的组件外,在开发中我们可能对于一些基本的操作都需要封装成组件,以供开发规范使用。
总结
分析Cola除了我们可以在开发过程中去直接引用这个框架外,更重要的是我们可以改变我们的编程思维去学习这个思考过程,学习编程方法,应用到我们实际的项目中,让我们朝着更优秀的程序员前进。
领域驱动设计实践框架-COLA的解读相关推荐
- 【DDD】领域驱动设计实践 —— UI层实现
前面几篇blog主要介绍了DDD落地架构及业务建模战术,后续几篇blog会在此基础上,讲解具体的架构实现,通过完整代码demo的形式,更好地将DDD的落地方案呈现出来.本文是架构实现讲解的第一篇,主要 ...
- EntityFramework之领域驱动设计实践(十)(转)
http://www.cnblogs.com/daxnet/archive/2010/07/19/1780764.html 规约(Specification)模式 本来针对规约模式的讨论,我并没有想将 ...
- 苏宁金融会员领域驱动设计实践
苏宁金融会员领域驱动设计实践 背景介绍 近年来,苏宁集团业务不断扩大,用户快速增长,线上线下融合不断深入,系统的复杂性越来越高,技术的广度和深度都在不断拓展. 在整个集团技术不断迭代演进的过程中,集团 ...
- 领域驱动设计实践(一)(转)
分层构架 在分析领域驱动设计之前,我们需要先回顾以前的分层架构."层"是一种体系结构模式,也是被广大软件从业人员用的最为广泛而且最为灵活的模式之一.其中最为大家所熟知的就是三层架构 ...
- 【转】EntityFramework之领域驱动设计实践(三)
原文地址:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772593.html 案例:一个简易的销售系统 从现在开始,我们将以一个简易的销售系统为 ...
- EntityFramework之领域驱动设计实践(五)
聚合 聚合(Aggregate)是领域驱动设计中非常重要的一个概念.简单地说,聚合是这样一组领域对象(包括实体和值对象),这组领域对象联合起来表述一个完整的领域概念.比如,根据Eric Evans&l ...
- 薪水支付系统领域驱动设计实践
(一) 通过领域驱动设计想解决什么问题 一个系统,按理说针对的行业是固定的,业务也比较接近,可是每次换个用户,总感觉需求变化一点点,系统却要改得天翻地覆.修改后的代码让不忍直视,心里暗暗嘀咕,神 ...
- EntityFramework之领域驱动设计实践(八)
仓储的实现:基本篇 我们先从技术角度考虑仓储的问题.实体框架(EntityFramework)中,操作数据库是非常简单的:在ObjectContext中使用LINQ to Entities即可完成操作 ...
- 领域驱动设计实践:还是图书馆借书的例子
去年开始博客园和Jdon有一场DDD的讨论,是关于如何给一个图书馆的应用系统建模.大概是在讨论几个经典的Use Case:办卡.持卡借书和还书. 讨论最开始由博客园的张逸大牛发起(链接在此),给出了一 ...
最新文章
- 比特币和加密货币入门
- kali最新国内更新源sources
- 你的网站添加X-UA-Compatible meta标签了吗?
- iptables 生效_Linux防火墙Firewall和Iptables的使用
- 测试智慧城市项目API接口
- 6月21日武汉见!华为nova 5正式官宣:麒麟980+40W快充
- ofbiz 分开默认数据库
- 小兔子(PAT乙级练习题)
- java判断zip包的编码格式_java解压zip包出现乱码
- MDClub 轻量级网论坛源码
- Android Studio 实现播放本地/网络视频
- python seo cms_「SEO帝国」 SEO中讲的 CMS是什么意思
- ERP、MES(作用、功能、部署、相关模块)
- 关于程序员的几个小段子
- 关闭-您继续使用该词
- 蓝桥杯 高精度加法 c++实现
- 拍拍抢拍精灵 --腾讯拍拍秒杀器--截图
- 普林斯顿微积分读本——第二章 三角学回顾(读书笔记)
- MAJOR.MINOR.PATCH
- 课设舵机狗总结文——CubeMX+STM32F4+FreeRTOS+USART2+幻尔舵机控制板 实现动作组稳定运动