DDD结合整洁架构落地实践
一、整洁架构分层
整洁架构分层如图所示,从内到外分别为实体->用例->接口适配器->框架与驱动程序。其中实体层和用例层包含业务逻辑、接口适配器层是翻译层,负责把外部数据翻译成业务层能够识别的结构、框架与驱动程序负责各种IO。
二、DDD分层
六边形分层
1、我们最初落地的DDD分层架构如下图所示,这种分层结构类似于六边形架构,本质上把代码分成了2层,一层是业务逻辑和业务逻辑依赖的接口、另一层是接口的具体实现和数据库、框架等细节。
2、在这种DDD分层架构中,内层圆代表业务逻辑层,其中实体、值对象、聚合、领域服务等都对应于整洁架构中的实体层;应用服务层对应的是整洁架构中的用例层。
3、这种分层结构的缺点是不完全符合整洁架构要求的插件式架构,虽然我们可以把appliation层和domain层整体打包,适配不同数据库、前端、框架等。application层和domain层中的domain service不包含业务逻辑,只包含接口,这些业务逻辑还需要再实现遍。
整洁分层
1、由于我们项目是toB项目,不同甲方公司对数据库、前端、框架等这些技术要求可能不一致,比如有的公司要求使用mysql、有的公司要求使用oracle。但是业务逻辑是基本一致的,这非常符合插件式架构,于是我们对架构做了改进。
2、等等,看起来和上面的一样?嗯,整体上图差不多,区别在细节上,application和domain层里的应用服务和领域服务包含了具体实现,只有服务具体实现有其他依赖的时候才引入这个依赖的接口,而不是整体把应用服务和领域服务的实现类放到infrastructure里面。
3、整洁架构里有一个老大难问题,就是事务的处理。我们一般会在application层中处理事务,原来六边形架构的时候application层的实现是在infrastructure里,是可以依赖spring的,方法上直接加个@Transactional注解就行;但是整洁架构中要求application层即要有业务逻辑实现,又不能依赖spring等框架,所以事务的处理和依赖关系管理变得困难。
- 解决方案:关于依赖关系注入我们可以在infrastructure或者starter启动模块里通过@configuration进行注入。关于事务管理我们可以借用spring手动提交事务,然后借助注解和切面实现新的事务注解,这样application就即包含业务逻辑又可以处理依赖关系和事务了。
4、此时我们可以说实现了比较全面的插件式架构,把domain和application放到任何公司的项目里,我们不用实现业务逻辑,只需要实现数据库、web等技术细节即可。
三、实现细节
1、数据库是实现细节
- DDD设计中我们是从domain出发,推后设计表结构
- 假如内存无限大、永不宕机,那么我们只设计对象数据结构,不用考虑数据库,所以数据库是关乎磁盘的IO
2、web是实现细节
- DDD设计中不会首先考虑UI等的数据结构,推后通过cqrs直接查表翻译成DTO、或者领域对象翻译成DTO,所以UI数据结构设计可能比表设计还要靠后
- Web本质上是一种网络IO
3、应用框架是实现细节
- 框架如spring主要用来管理依赖关系,管理事务等,当我们引入框架后,如果没有做特殊管理,后来人可以很随便的把各种工具类、template类等引入到业务代码中,导致依赖关系混乱
- 框架升级可能导致我们依赖不需要依赖的东西,违背单一职责
- 未来可能切换到更好的框架,而切换一定会影响业务逻辑
4、各种redis、kafka、es等中间件也是技术细节
- 这些本质上都是网络IO
- 版本升级等都会影响业务逻辑
http://www.taodudu.cc/news/show-2584776.html
相关文章:
- 第一章 整洁代码
- 1 - 整洁代码 - 代码整洁之道
- 整洁代码
- 计算机桌面整洁,想让你的桌面变得整洁干净,这几款桌面整理软件别错过
- DDD中常提到的应用架构总结(六边形、洋葱、整洁、清晰)
- 为什么保持代码整洁如此重要?
- 关于代码整洁
- 代码整洁之道——如何写出整洁高效的代码
- 【笔记】架构整洁之道
- 整洁代码的理解
- 架构整洁之道,整洁架构
- 如何利用官方SDK文件来辅助开发?
- 网易云音乐实时数仓2.0进阶之路
- 微信SDK的使用
- 鸿蒙OS不支持游戏,部分安卓游戏在华为鸿蒙 OS 上运行,被识别成使用 PC 端模拟器...
- 微信jssdk常见错误及解决方法
- SDK目录介绍
- C++学习(一八一)android的NDK、SDK版本的对应关系
- 微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用
- Linux内核4.4 init,linux4.4内核启动到INIT: version 2.88 booting 卡住
- Android SDK是什么
- Node.js 静态web服务
- 在Qt中配置海康工业相机SDK及遇到的问题(报错)
- 【论文笔记_自监督知识蒸馏】Refine Myself by Teaching Myself : Feature Refinement via Self-Knowledge Distillation
- 【Windows编程】Windows Socket API介绍
- 为什么我们要学习Microsoft Graph
- Windows 11 Insider Preview Build 22000.132 官方简体中文版 iso 下载
- vue 运行报错
- Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
- Android SDK的级别
DDD结合整洁架构落地实践相关推荐
- DDD 领域驱动设计落地实践:六步拆解 DDD
引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...
- 中小型研发团队架构落地实践18篇,含案例、代码
1 写在前面 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速迭代以验证商业模式, ...
- 【DDD落地实践系列】DDD 领域驱动设计落地实践:六步拆解 DDD
引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...
- DDD 领域驱动设计落地实践系列:工程结构分层设计
引言 前面几篇文章中,笔者给大家阐述了 DDD 领域驱动设计的三大过程,重点围绕如何通过战略设计与战术设计进行 DDD 落地实践进行了详细的讨论,但是还没有涉及到工程层面的落地.实际上所有的这些架构理 ...
- DDD领域驱动设计落地实践系列:战略设计和战术设计
引言 通过前面的文章介绍,相信大家对于什么是DDD有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导.但是对于如何具体落地使用DDD, ...
- DDD 领域驱动设计落地实践系列:战略设计和战术设计
引言 通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等问题提供了方向和指导.但是对于如何具体落地使用 ...
- 干货 | 携程基于BookKeeper的延迟消息架构落地实践
作者简介 本文作者magiccao.littleorca,来自携程消息队列团队.目前主要从事消息中间件的开发与弹性架构演进工作,同时对网络/性能优化.应用监控与云原生等领域保持关注. 一.背景 QMQ ...
- DDD领域设计架构落地
前言 经历了几年的代码生涯,经常会遇到一个问题,一个公司的业务系统,随着迭代的次数越来越多,代码结构越来越混乱,即便是开始之初结构是如何整洁,也难逃这厄运. 究竟是什么缘由导致的,可以大概概括为如下几 ...
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...
- DDD微服务架构设计第四课 微服务落地实践的技术中台
10 微服务落地的技术实践 如今,做一个优秀的程序员越来越难.激烈的市场竞争.互联网快速的迭代.软件系统规模化发展,无疑都大大增加了软件设计的难度.因此,对于架构师的能力要求也越来越高,就像我的一本书 ...
最新文章
- [CCC 2018] 平衡树
- Linux下安装配置NTP时间同步服务器
- 点击了SAP CRM HANA report超链接,背后都发生了什么
- bzoj 1024 [SCOI2009]生日快乐——模拟
- SpringBoot2 整合FreeMarker模板,完成页面静态化处理
- 下载EPM包详细运行日志
- jQuery 遍历 - prev() 方法
- 关于java中的httpsession_JavaWeb——HttpSession
- stm32mp157开发板MIC 接口测试方法
- 中冠百年|家庭理财投资必备资金规划有哪些
- SQL->基础->进阶
- 【矩阵论】5. 线性空间与线性变换——生成子空间
- transformers的beam_search
- 6_商品 SPU 与 SKU
- 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]
- Python:orator/backpack内置数据操作类Collection
- 三角形类 (Triangle class)
- (转)DataGrid资料
- 功夫电影中非常经典(武术非常实用)
- 为什么重写equals方法必须重写hashcode方法
热门文章
- wmp12功能打不开_使用Windows Media Player Plus向WMP添加新功能
- CSP2019滚粗记
- 入门级服务器的选购——DIY篇
- Exception: ROM is missing for ms_pacman, see https://github.com/openai/atari-py#roms for instruction
- 浏览器默认主页被篡改(chrome,IE)
- HibernateValidator学习笔记
- Android仿qq登陆界面
- cf-645D. Robot Rapping Results Report(拓扑序列)
- ubuntu20.04不是所有者所以不能更改权限
- 后端知识点:互联网中B端客户和C端客户的区别