关于COLA架构的讨论

2023-11-11

理解

分层

概念网上可以搜到很多,大体分为:

adapter

client

app

infra

domain

这五层。

图例这里有,就不贴了。

adapter和app相当于spring里的controller+service,domain是领域模型层,infra相当于domain的实现层(比如dao或rpc访问)。唯独client,有点疑问,目前我在实践中是把client作为app的对外接口层,隔离adapter和app之用。但也看到其他的理解,比如认为client是对外部接口调用的封装(我个人倒认为infra层做这个事情更合适,因为infra是业务防腐层)。

对象:XO

vo(value object):adapter层组装的对象,adapter将app返回的dto处理成可供界面展示的vo。它的重要特点就是展示,所以,一般服务端返回给浏览器或APP展示的数据都是vo,而从浏览器或APP调用服务端rest接口传递的数据则是dto,因为后者往往是内部数据,着重体现了传递(transfer)二字。

dto:app层要处理的对象,在前端 -> adapter -> app层间传递使用,所以叫data transfer object。app层可以将entity组装成dto(这种组装可能是内存里做的,但更一般的是数据库的关联查询语句)。

entity:特定领域的对象模型,放domain层。

do(data object):infra层对象,由infra层将rpc、查数据库获得的do转成entity。这里有个问题,如果在mybatis里做一个关联查询,查询出的其实是一个dto(比如领域模型A里包含了领域模型B),但这个dto是不能放app层的(那样infra无法访问),逻辑上也不建议放infra层,就只能放domain了。

实践当中,有两个极端,一是让vo在各层间传递,实际充当了四类对象,这样的vo很大,填充的字段会越来很多,很难做到内聚和解耦;一是每层都做自己的XO,这样会有很多看起来很相似的数据类,数据类间的converter工作量也很大。

我个人的建议:至少要有entity(关联查询时是dto)和vo这两层对象,确保界面与业务领域的适当解耦,同时数据converter的工作量也可控。当然,如果就是单表的CRUD,仅有一层entity对象也是可以的(实际业务中应该不多见,毕竟界面展示通常要考虑数字转枚举、国际化展示等,新做一层vo更合理)。

依赖强约束

  • app层不能访问infra层,因为它只能看到domain及其中的domainGateway

  • adapter可直接访问app层,当然也可通过client层的接口隔离(不强制,但代码结构更清晰),但不能直接访问infra层。实际当中,实际当中,adapter可能有需要访问domain层的诉求,比如根据外部传入的查询dto在mybatis里拼动态SQL场景,该dto将跨越adapter、app、domain和infra四层,这时,可以考虑在app层做一下XO的转换(例如通过继承、属性复制等手段)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于COLA架构的讨论 的相关文章

  • STM32程序死在HardFault_Handler的分析和解决

    最近开发STM32F070F6P6项目 发现程序老是运行不了 仿真发现 程序总是死在HardFault Handler 程序总是死在第二个初始化函数里面 上网查询资料发现 STM32出现HardFault Handler故障的原因主要有两个

随机推荐

  • 中国的互联网技术有多牛逼?

    中国的电商 网约车 共享单车 外卖等都居于全球第一 物流配送效率全球第一 表面上看起来这些都是互联网技术 在全球居于领先地位 然而古怪的是至今为止中国互联网唯一走向世界的只有Tik Tok 在中国以外的市场 互联网还是由谷歌 亚马逊等美国企
  • Web自动化测试流程:从入门到精通,帮你成为测试专家!

    Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具是很重
  • 如何生成1亿个手机号码?Python来教你。真实的面试题哦。

    案例解析 最近在网上看到一个python的面试题目 如何用Python生成1亿个手机号码 我第一眼看到的时候心想 这个还不简单 直接 random randint 1 999999999999 就完事了 但是马上就发现了这其中的错误 这个是
  • sql注入系列之Sqli-labs(less-8)

    判断注入点 http 192 168 81 210 sqli Less 8 id 1 id等于1的时候正常id等于1 的时候页面有改变 因此可以判断可能存在注入 并且是布尔型盲注 判断注入类型 输入1 and 1 1和1 and 1 2发现
  • MySQL字符串截取:左截取、右截取、按关键字截取

    1 从左开始截取字符串 语法 SELECT LEFT str len str 被截取的字符串 len 截取长度 示例 SELECT LEFT TF 8220210412003 1 10 结果为 TF 8220210 2 从右开始截取字符串
  • python使用matplotlib创建三维图时隐藏坐标轴、网格、背景的方法

    使用下面的代码创建一条空间直线 import numpy as np import matplotlib pyplot as plt 创建一个空白画布 fig plt figure 创建一个子图 ax fig add subplot pro
  • [-] \Navicat-Cracker NavicatCrackerDlg.cpp:463 ->Please Patch first Or Specified RSA private key

    报错信息 Navicat Cracker NavicatCrackerDlg cpp 463 gt hinese Can t Generate Activation Code Keygen HINT Please Patch first O
  • 【Mo 人工智能技术博客】文本挖掘之LDA主题模型

    文本挖掘之LDA主题模型 作者 郑培 引言 主题模型是文本挖掘的重要工具 近年来在工业界和学术界都获得了非常多的关注 在文本挖掘领域 大量的数据都是非结构化的 很难从信息中直接获取相关和期望的信息 一种文本挖掘的方法 主题模型 Topic
  • ReLU,Sigmoid,Tanh,softmax,pipeline【基础知识总结】

    一 ReLU Rectified Linear Activation Function 1 优点 2 缺点 3 补充 1 Leaky ReLUs 2 参数化修正线性单元 PReLU 3 随机纠正线性单元 RReLU 二 Sigmoid 1
  • echarts自适应父级盒子宽度

    这里写自定义目录标题 效果 手动改变窗口大小 echarts实现自动适应父级盒子宽度 1 在vue中安装一个插件element resize detector 这是一个元素调整大小检测器 npm install element resize
  • 微观的C/C++编译执行过程

    前言 相信能看到这篇文章的同学 是对C语言很热爱的人 最开始学习C语言的时候 我们大多数人都是用集成开发环境 VS VC devc 等 当我们把C语言源代码写好了之后 在集成开发工具中这里点一下 哪里点一下 代码就跑起来了 这种快乐的感觉的
  • Linux下node-sass安装失败的解决方法与简单使用

    记录一下安装node sass的过程 关于CSS是不是一门编程语言 这里不讨论 但是它没有变量 语句 函数 反正我觉得他不是编程语言 于是程序员们发明了CSS预处理器 css preprocessor 它是一种专门的编程语言 可以使用你会的
  • java经典算法题

    目录 1 Java多线程 写一下两个线程交替打印 0 100 的奇偶数 2 线程安全的单例模式 3 用两个栈实现队列 4 实现单链表反转操作 5 Java实现二分查找 6 冒泡排序 7 快速排序 快速排序的基本思想 8 Java单链表实现快
  • 类的设计方法

    1 类名首字母应该大写 字段 方法以及对象 句柄 的首字母应小写 对于所有标识符 其中包含的所有单词都应紧靠在一起 而且大写中间单词的首字母 例如 ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现
  • vue中页面分页引导

    一 使用driver js做页面分页引导 default 先来看看默认引导的效果 可以根据自己的需求做页面样式上的修改 change 修改修改如下 移动端web端都可以用 接下来说一下具体的用法 1 npm 安装 npm install d
  • EsayExcel使用

    EsayExcel简单入门 1 maven依赖
  • 华为OD真题学习-查找单入口空闲区域 100

    回溯法 基本做法是搜索 通过x 1 x 1横向遍历 y 1 y 1纵向遍历 获取满足连通的坐标 原始参考链接 华为OD机试真题 python 查找单入口空闲区域 2022 Q4 100分 无痕de泪的博客 CSDN博客 查找单入口空闲区域
  • static变量可以被修改吗?

    静态变量并不是说其就不能改变值 不能改变值的量叫常量 其拥有的值是可变的 而且它会保持最新的值 说其静态 是因为它不会随着函数的调用和退出而发生变化 即上次调用函数的时候 如果我们给静态变量赋予某个值的话 下次函数调用时 这个值保持不变 静
  • Java Graphics2D绘制背景透明的图形过程

    package com jhy time import java awt AlphaComposite import java awt BasicStroke import java awt Color import java awt Gr
  • 关于COLA架构的讨论

    理解 分层 概念网上可以搜到很多 大体分为 adapter client app infra domain 这五层 图例这里有 就不贴了 adapter和app相当于spring里的controller service domain是领域模