拆解COLA框架

COLA 是 Clean Object-Oriented and Layered Architecture的缩写,代表“整洁面向对象分层架构”。由阿里大佬张建飞所提出的一种基于DDD和代码整洁理论所诞生的实践理论框架,详细内容可阅读《程序员的底层思维》和相关git代码去了解

项目地址:GitHub - alibaba/COLA: 🥤 COLA: Clean Object-oriented & Layered Architecture

框架整体结构

面把COLA框架的主要架构梳理一下,这里的框架图采用COLA4.0版本(当前作者认为的最优形态)

 COLA整体上由两部分组成,代码架构和通用组件,两者并非强绑定,代码架构是一套基于maven的代码模板,通用组件则是可选项,可以理解为Common组件包。

Adapter层(适配层)

负责对前端展示(Web、Wireless、WAP)的路由和适配。对于传统B/S系统而言,Adapter层就相当于MVC中的Controller。

App层(应用层)

主要负责获取输入、组装上下文、参数校验、调用领域层做业务处理,以及发送消息通知(如有需要)等。层次是开放的,应用层也可以绕过领域层,直接访问基础设施层。

Domain层(领域层)

用于封装核心业务逻辑,并利用领域服务(Domain Service)和领域对象(Domain Entity)的方法对App层提供业务实体和业务逻辑计算。领域层是应用的核心,不依赖任何其他层次。

Infrastructure层(基础设施层)

主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,Infrastructure层还肩负着领域防腐的重任,外部依赖需要通过Gateway的转义处理,才能被App层和Domain层使用。

Commpont(外挂Cola扩展组件)

非业务相关的功能组件包

对象类型概念统一

使用COLA,首先就是要明确各类对象的概念以及所处位置,统一认知并且严格执行。

DO(Data Object):数据对象

DO应该跟其名字一样,仅作为数据库中表的1:1映射,不参与到业务逻辑操作中,仅仅负责Infrastructure层的数据持久化以及读取的实体对象

Entity:实体对象

对应业务模型中的业务对象,字段及方法应该与业务语言抱持一致,原则上Entity和Do应该是包含嵌套的关系,且Entity的生命周期仅存在在系统的内存中,不需要序列化以及持久化,业务流程结束,Entity也应该跟随消亡

DTO(Data Transfer Object): 数据传输对象

主要作为和系统外部交互的对象,DTO主要是数据传输的载体,期间可以承载一部分领域能力(业务相关的判定职责等);

VO(view Object):展示层对象

性质和DTO相差不多,也是数据传输载体,主要是作为对外交付数据的载体,承载部分数据隐藏、数据保护、数据结构化展示的作用。

代码组织结构及层次间关系

Cola本身是以一个maven Archetypes模板,基于该模板进行项目搭建,细看模板结构能发现COLA整体采用maven module的结构来构建代码,划分原则是结合技术维度和领域维度综合划分:

相应的分层则对应到不同的module中(技术维度划分),每一层对应一个maven的module 

<modules>
  <module>eden-demo-cola-adapter</module>
  <module>eden-demo-cola-app</module>
  <module>eden-demo-cola-domain</module>
  <module>eden-demo-cola-infrastructure</module>
  <module>start</module>
</modules>

模板生成后的代码结构如下:

然后就是关于每个module的代码目录划分原则(基于领域维度进行划分),即每个module中对应的概念都划分到具体某一功能领域包中:

 

而每个module(层)之间的依赖关系如下图: 

Comm本身作为公共内容被所有module依赖,Adapter作为系统唯一外部输出仅依赖APP,App本身除了依赖领域层外还因为CQRS相关内容依赖Infras;Domain层巧妙地使用依赖倒置让Infras层反向依赖它,以保证了Domain的独立和完整。整体是按照技术维度进行划分的。

 

其中Domian层中的gateway仅仅定义interface,而在infrast层中进行gateway的Impl类,由此完成了巧妙地依赖倒置(大佬在书中提到的防腐层概念,也是DDD设计思想中的存储库概念的实践),解耦了Domain,让Domain地module作为一个内聚的个体,聚焦核心业务开发,并且此处的设计,gateway作为与Infras层的防腐层,很灵活的将业务和数据进行隔开。 

框架运行逻辑

场景1(包含业务诉求)

由客户端发起请求,首先Adapter层接收请求,进行相关的校验后进行数据封装(Coverter操作:由请求参数封装为App层所需要的DTO结构),根据预设的逻辑去调用App的内容;DTO数据进入App后, App根据业务诉求,然后调用Domain的ability和module进行业务组装(Converter操作:将DTO转换为Entity对象);被调用的Domian在进行业务处理过程中调用Infras层去进行相关持久化和查询;Infras在被Domain调用时,需要把传入的Entity转换为内部对应数据的DO对象。最后逐层返回,相应的在Adapter层将DTO转为VO

场景2(CQRS诉求):

由外部客户端发起的不携带业务处理的查询操作,例如:某某数据列表查看、某某内容统计,则由Adapter接收请求后,封装参数对象后,调用相关App内容,App内部进行DTO和DO的相互coverter操作后,直接调用Infras层进行数据的查询操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/773214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在地图上根据经纬度,画一个矩型围栏,设置每个点的经纬度

在做一个需求时有一个小点就是添加一个配送区域(5公里直径内的)矩形围栏 我做的比较简单 大家看看有没有帮助, 也是精简代码。测试效果上相对是精准的 //谷歌&#xff0c;根据经纬度获取以它为中心半径为5公里内的矩形的四个点经纬度getDefalutPoints (lng: number, lat: num…

lt6911UXC 国产原装 高性能HDMI2.0转MIPI DSI / CSI芯片方案 提供LT 开发资料包及在线软硬件技术支持!

1.说明 LT6911UXC是一款高性能HDMI2.0到MIPI DSI / CSI转换器&#xff0c;用于VR&#xff0c;智能电话&#xff0c;显示应用。 HDMI2.0输入支持高达6Gbps的数据速率&#xff0c;从而为4k 60Hz视频提供足够的带宽。还支持HDCP2.2进行数据解密。 对于MIPI DSI / CSI输出&#xf…

企业数据API平台:获取企业多维度信息

数据API平台是指提供一系列预先定义的接口、协议与工具&#xff0c;允许不同应用程序或系统之间进行数据交换和通信的平台。这些接口被称为数据API&#xff08;Data Application Programming Interface&#xff09;&#xff0c;是数据管理系统或应用程序提供的一组开放式接口。…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包&#xff0c;解压命令 tar -zxvf /install…

【博客21】缤果Qt5仿小米耳机APP布局_PC端软件(高级篇)

小米耳机 备注&#xff1a;此软件只是简单的实现布局和界面跳转逻辑, 并未加入小米协议相关内容,因需要鉴权方式验证,故无法进行通讯编程. 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) Android反编译工具: apktool 小米小爱开放平台 - 语音服务平台 - 文档中…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

android应用的持续构建CI(四)-- 依赖环境(兼容多版本的gradle和jdk)

一、背景 android应用的构建前提是&#xff0c;安装好了gradle和jdk。在实际使用的过程中&#xff0c;不同的android应用&#xff0c;对gradle和jdk的版本要求不一。 于是&#xff0c;在jenkins服务器上&#xff0c;我们需要安装多种版本的gradle和jdk。 安装过jdk的小伙伴应…

Jenkins 使用 Publish over SSH进行远程访问

Publish over SSH 是 Jenkins 的一个插件,可以让你通过 SSH 将构建产物分发到远程服务器。以下是如何开启 Publish over SSH 的步骤: 一、安装 Publish over SSH 插件 在 Jenkins 中,进入 "Manage Jenkins" > "Manage Plugins"。选择 "Availab…

【spring MVC的执行流程】

SpringMVC可以说是Servlet的封装&#xff0c;屏蔽了Servlet的很多细节&#xff0c;比如Servlet再获取参数的时候需要不停地getParameter,现在只要在SpringMVC方法定义对应的JavaBean&#xff0c;只要属性和参数名一致&#xff0c;SpringMVC就可以帮我们实现将参数封装到JavaBea…

基础扫盲:js作用域及其优先级,有示例代码。

在 JavaScript 中&#xff0c;作用域指的是变量和函数的可访问性和可见性。 JavaScript 中的作用域有以下几种&#xff1a; 1. 全局作用域&#xff08;Global Scope&#xff09;&#xff1a;全局作用域是指在代码中任何地方都可以访问的作用域。在全局作用域中声明的变量和函数…

DFS之连通性模型——AcWing 1112. 迷宫

DFS之连通性模型 定义 DFS&#xff08;深度优先搜索&#xff0c;Depth-First Search&#xff09;之连通性模型主要用于图论问题中判断图的连通性&#xff0c;即确定图中的所有节点是否可以通过边相互到达。 DFS&#xff08;深度优先搜索&#xff0c;Depth-First Search&…

深度学习——深度学习中感受野的计算

感受野 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一个非常重要的概念。它描述了网络中某一层的输出&#xff08;通常是特征图上的一个像素点&#xff09;所对应的输入图像上的空间范围。这个范围代表了该输出…

Jelly Merge | Template + Editor(休闲益智游戏包)

Jelly Merge是Watermelon Games开发的一款完整游戏。 这款完全可定制的益智游戏具有简单但超级有趣的游戏玩法。 您下一次成功的完美起点&#xff01; 我们的优势 &#x1f9d1;&#x1f3fb;‍&#x1f4bb; 不和谐支持 &#x1f5c3;️ 详细文档 &#x1f6e0;️易于使用的工…

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…

【BUUCTF-PWN】10-bjdctf_2020_babystack

简单的栈溢出&#xff0c;ret2text 64位&#xff0c;开启了NX保护 执行效果&#xff1a; main函数&#xff1a; 因为读入的字符长度可以由用户输入的第一个参数值决定&#xff0c;因此read函数存在栈溢出 覆盖距离为0x108 存在后门函数&#xff1a; 后门函数地址0x4…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 介绍&#xff1a; …

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题&#xff1a;opengl如何判定应该使用下一级的mipmap呢&#xff1f; 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

《昇思25天学习打卡营第8天|模型训练》

文章目录 今日所学&#xff1a;一、构建数据集二、定义神经网络模型三、了解超参、损失函数和优化器1. 超参2. 损失函数3. 优化器 四、训练与评估总结 今日所学&#xff1a; 在今天这一节我主要学习了模型的训练&#xff0c;知道了模型训练一般分为四个步骤&#xff1a; 构建…