news 2026/5/15 3:04:35

从 ABP 到 CleanDDD:关于软件长期演进的一些思考

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从 ABP 到 CleanDDD:关于软件长期演进的一些思考

从 ABP 到 CleanDDD:关于软件长期演进的一些思考

最近在项目中接触到了CleanDDD,也重新审视了我们长期使用的ABP 技术栈

这并不是一篇“反 ABP”的文章,而是一次站在时间维度上的技术反思

如果你也在维护一个已经运行多年、并且还会继续演进的系统,或许会对下面的内容产生共鸣。


一、站在时间轴上看软件开发的变化

如果把时间拨回十年前,软件开发面临的核心问题其实很简单:

  • 有没有系统
  • 能不能尽快上线
  • 能不能稳定跑起来

在那个阶段,交付本身就是最大的价值

但今天,情况已经完全不同了。系统不再稀缺,真正昂贵的反而变成了:

  • 系统维护成本
  • 需求频繁变更的风险
  • 人员流动带来的不确定性
  • 业务规则不断叠加后的复杂度

软件开发的核心矛盾,已经从:

“能不能做出来”

转变为:

“还能不能持续演进”


二、CleanDDD 在解决什么问题

很多人第一次看到 CleanDDD,会觉得它:

  • 结构清晰
  • 分层明确
  • 代码“看起来很干净”

但真正让我开始认真看待它的,并不是这些表象。

CleanDDD 真正试图回答的,是一个非常现实的问题:

这个系统在 3~5 年之后,还能不能被安全地修改?

在大量项目中,系统难以维护,往往不是因为业务本身有多复杂,而是因为:

  • 业务规则分散在各个角落
  • 没有人能说清楚「改这个需求到底该动哪一层」

CleanDDD 做的一件事其实很“笨”,但非常有效:

强制把业务规则收敛到领域层

这不是为了形式上的 DDD,而是为了:

对抗系统复杂度的自然增长


三、真正的风险:系统没人敢改

在实际工作中,我越来越觉得一个系统最大的风险,并不是开发速度慢,而是:

关键人员离开后,系统没人敢动

很多系统不是不能改,而是:

  • 不知道会影响哪里
  • 不确定会不会引发连锁问题
  • 最终选择「能不动就不动」

CleanDDD 的一个重要价值,在于它试图把业务知识:

  • “人的经验”转移到“模型和代码结构”

这本质上是在降低组织层面的风险,而不仅仅是技术问题。


四、交付速度 vs 长期成功率

快速交付本身没有问题,真正的问题在于:

很多系统只对第一次交付负责

在后期需求中,我们经常看到这样的情况:

  • 一个看似很小的改动
  • 引发多个模块的连锁修改
  • 最终演变成一次高风险操作

CleanDDD 关注的并不是:

“这个功能能不能尽快上线”

而是:

“第 20 次、第 30 次需求调整时,系统还能不能稳住”

这是一次性交付成功,与长期演进成功之间的差别。


五、一些非常实际的工程收益

从工程角度看,CleanDDD 带来的变化是非常具体的:

  • 业务逻辑只存在于领域层
  • 每个聚合都有清晰的职责边界
  • 行为具备明确的输入与输出

当需求变化时:

  • 你大致知道该从哪个领域模型入手
  • 也能明确哪些地方不应该被修改

而这,恰恰是很多 ABP 项目在后期最容易失控的地方。


六、为什么 CleanDDD 更适合长期演进的系统

CleanDDD 从一开始的设计目标,就不是:

“这个功能能不能快点上线”

而是:

“五年之后,这个系统还能不能继续加新规则”

一个非常直观的对比如下:

场景常见 ABP 项目CleanDDD
新增规则AppService 中不断加 if新的领域行为
行为复用复制业务逻辑复用聚合能力
业务重构高风险局部替换
新人接手需要较长熟悉期更快理解业务

七、CleanDDD 与 AI 编码的一点关系

这是一个相对新的视角,但我认为非常重要。

AI 编码本质上依赖几件事:

  • 清晰的上下文
  • 稳定的边界
  • 可预测的结构

而这些,恰好都是 CleanDDD 所强调的。

领域模型、统一语言、明确的行为边界,使得代码空间本身是:

低熵的、可组合的

相比之下,典型的 ABP 项目中:

  • ApplicationService
  • Repository
  • UnitOfWork
  • 各种框架约定

往往混杂在一起。这种结构对人尚且吃力,对 AI 来说更容易误判上下文

这不是未来的假设,而是已经在发生的现实。


八、关于框架老化的问题

有一句话我越来越认同:

所有框架都会老,但业务不会

CleanDDD 的一个隐性优势在于:

  • 框架升级,主要影响基础设施层
  • 领域层可以长期保持稳定

而在 ABP 中,领域模型往往:

  • 继承框架基类
  • 生命周期与框架深度绑定

在 5~10 年周期的系统中,这种差异会被不断放大。


九、关于 ABP:不是对错,而是取舍

需要强调的是,这并不是一篇否定 ABP 的文章。

ABP 的设计目标非常明确:

  • 快速交付 CRUD 系统
  • 提供完善的权限、多租户、审计能力
  • 降低团队协作成本

为了实现这些目标,它必然做出一些取舍:

  • ApplicationService 权力较大
  • Repository 支持灵活查询
  • 实体继承框架基类

这些设计,天然更接近事务脚本模型,而不是严格的 DDD。


十、为什么 ABP 天然不追求“纯 DDD”

这更多是由历史背景决定的。

ABP 诞生于 2013~2016 年,当时:

  • .NET 企业开发以 N 层架构为主
  • 系统多为 ERP / OA / 管理后台
  • 企业最关心的是交付速度和通用能力

DDD 在国内更多停留在理论层面,并非主流实践。

因此,ABP 的定位从来都是:

企业级应用框架

DDD 只是它兼容的一种思想,而不是第一性原则。


十一、一个更工程化的总结

如果把话说得更直白一些:

ABP 解决的是:如何规模化交付软件
CleanDDD 解决的是:如何长期演进业务系统

这并不是谁对谁错,而是面对的问题不同。


十二、一个更现实的建议

与其“反 ABP”,不如“驯服 ABP”。

在 ABP 技术栈下,完全可以:

  • 用 CleanDDD 构建领域层
  • 用 ABP 提供基础设施能力
  • 显式使用领域事件
  • 避免在 AppService 中堆积业务规则

这可能不是最快的路,但很可能是:

未来几年风险最低的路


写在最后

CleanDDD 本质上并不是一种“更高级的写法”,而是一种:

为未来不确定性预留空间的工程选择

在系统复杂度还可控的时候,
为未来 3~5 年留一条安全的演进路径,本身就是一件非常值得投入的事情。

项目地址:
https://github.com/netcorepal/netcorepal-cloud-framework


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 15:37:36

为什么选择TensorFlow 2.9镜像进行大模型训练?

为什么选择TensorFlow 2.9镜像进行大模型训练? 在当前AI研发加速迈向工业化和规模化的背景下,一个稳定、高效且可复现的开发环境,往往比模型结构本身更能决定项目的成败。尤其是在大模型训练场景中,动辄数百GB显存占用、跨多卡甚至…

作者头像 李华
网站建设 2026/5/14 3:14:30

监控TensorFlow训练任务状态:Prometheus集成方案

监控TensorFlow训练任务状态:Prometheus集成方案 在现代深度学习项目中,一次模型训练可能持续数小时甚至数天。你有没有遇到过这样的场景:提交任务后只能干等结果,偶尔查看日志发现损失值早已不再下降,却无法第一时间察…

作者头像 李华
网站建设 2026/5/1 1:35:36

JAVA助力:同城羽毛球馆自助预约新方案

JAVA助力:同城羽毛球馆自助预约新方案一、方案背景与目标在全民健身热潮下,羽毛球作为一项广受欢迎的体育运动,其场馆预约需求日益增长。传统的人工预约方式存在效率低、信息不透明、管理成本高等问题。本方案旨在利用JAVA技术,打…

作者头像 李华
网站建设 2026/4/25 16:49:40

远程访问TensorFlow开发环境:SSH配置图文教程

远程访问TensorFlow开发环境:SSH配置实战指南 在深度学习项目中,你是否曾遇到这样的场景?本地笔记本跑不动模型,训练一次要十几个小时;团队成员之间因为环境版本不一致导致代码“在我机器上能跑”;或者你想…

作者头像 李华
网站建设 2026/5/10 18:48:39

是德示波器DSOX1202射频干扰抑制的实用方法

射频干扰(RFI)是影响示波器测量精度的重要问题,尤其在高灵敏度测试场景中,噪声可能导致波形失真、数据误差。针对是德DSOX1202示波器,以下从硬件优化、软件设置和环境控制三个维度,提供系统性降低RFI的方法…

作者头像 李华