一、整洁架构分层

整洁架构分层如图所示,从内到外分别为实体->用例->接口适配器->框架与驱动程序。其中实体层和用例层包含业务逻辑、接口适配器层是翻译层,负责把外部数据翻译成业务层能够识别的结构、框架与驱动程序负责各种IO。

image.png

二、DDD分层

六边形分层

1、我们最初落地的DDD分层架构如下图所示,这种分层结构类似于六边形架构,本质上把代码分成了2层,一层是业务逻辑和业务逻辑依赖的接口、另一层是接口的具体实现和数据库、框架等细节。
2、在这种DDD分层架构中,内层圆代表业务逻辑层,其中实体、值对象、聚合、领域服务等都对应于整洁架构中的实体层;应用服务层对应的是整洁架构中的用例层。
3、这种分层结构的缺点是不完全符合整洁架构要求的插件式架构,虽然我们可以把appliation层和domain层整体打包,适配不同数据库、前端、框架等。application层和domain层中的domain service不包含业务逻辑,只包含接口,这些业务逻辑还需要再实现遍。

image.png

整洁分层

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等技术细节即可。

image.png

三、实现细节

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结合整洁架构落地实践相关推荐

  1. DDD 领域驱动设计落地实践:六步拆解 DDD

    引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...

  2. 中小型研发团队架构落地实践18篇,含案例、代码

    1 写在前面 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速迭代以验证商业模式, ...

  3. 【DDD落地实践系列】DDD 领域驱动设计落地实践:六步拆解 DDD

    引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...

  4. DDD 领域驱动设计落地实践系列:工程结构分层设计

    引言 前面几篇文章中,笔者给大家阐述了 DDD 领域驱动设计的三大过程,重点围绕如何通过战略设计与战术设计进行 DDD 落地实践进行了详细的讨论,但是还没有涉及到工程层面的落地.实际上所有的这些架构理 ...

  5. DDD领域驱动设计落地实践系列:战略设计和战术设计

    引言 通过前面的文章介绍,相信大家对于什么是DDD有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导.但是对于如何具体落地使用DDD, ...

  6. DDD 领域驱动设计落地实践系列:战略设计和战术设计

    引言 通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等问题提供了方向和指导.但是对于如何具体落地使用 ...

  7. 干货 | 携程基于BookKeeper的延迟消息架构落地实践

    作者简介 本文作者magiccao.littleorca,来自携程消息队列团队.目前主要从事消息中间件的开发与弹性架构演进工作,同时对网络/性能优化.应用监控与云原生等领域保持关注. 一.背景 QMQ ...

  8. DDD领域设计架构落地

    前言 经历了几年的代码生涯,经常会遇到一个问题,一个公司的业务系统,随着迭代的次数越来越多,代码结构越来越混乱,即便是开始之初结构是如何整洁,也难逃这厄运. 究竟是什么缘由导致的,可以大概概括为如下几 ...

  9. 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践

    作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...

  10. DDD微服务架构设计第四课 微服务落地实践的技术中台

    10 微服务落地的技术实践 如今,做一个优秀的程序员越来越难.激烈的市场竞争.互联网快速的迭代.软件系统规模化发展,无疑都大大增加了软件设计的难度.因此,对于架构师的能力要求也越来越高,就像我的一本书 ...

最新文章

  1. [CCC 2018] 平衡树
  2. Linux下安装配置NTP时间同步服务器
  3. 点击了SAP CRM HANA report超链接,背后都发生了什么
  4. bzoj 1024 [SCOI2009]生日快乐——模拟
  5. SpringBoot2 整合FreeMarker模板,完成页面静态化处理
  6. 下载EPM包详细运行日志
  7. jQuery 遍历 - prev() 方法
  8. 关于java中的httpsession_JavaWeb——HttpSession
  9. stm32mp157开发板MIC 接口测试方法
  10. 中冠百年|家庭理财投资必备资金规划有哪些
  11. SQL->基础->进阶
  12. 【矩阵论】5. 线性空间与线性变换——生成子空间
  13. transformers的beam_search
  14. 6_商品 SPU 与 SKU
  15. 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]
  16. Python:orator/backpack内置数据操作类Collection
  17. 三角形类 (Triangle class)
  18. (转)DataGrid资料
  19. 功夫电影中非常经典(武术非常实用)
  20. 为什么重写equals方法必须重写hashcode方法

热门文章

  1. wmp12功能打不开_使用Windows Media Player Plus向WMP添加新功能
  2. CSP2019滚粗记
  3. 入门级服务器的选购——DIY篇
  4. Exception: ROM is missing for ms_pacman, see https://github.com/openai/atari-py#roms for instruction
  5. 浏览器默认主页被篡改(chrome,IE)
  6. HibernateValidator学习笔记
  7. Android仿qq登陆界面
  8. cf-645D. Robot Rapping Results Report(拓扑序列)
  9. ubuntu20.04不是所有者所以不能更改权限
  10. 后端知识点:互联网中B端客户和C端客户的区别