当前位置: 首页 > article >正文

DDD 中的代码组织:按技术层分 vs 按领域模块分,哪种才是正解?

前言在实践领域驱动设计DDD时你可能见过两种截然不同的代码组织方式一种是传统的按技术层划分文件夹另一种是按业务模块划分文件夹。两种写法的人都声称自己在做 DDD那到底哪种更合理本文来聊聊这个问题。一、两种风格长什么样风格 A按技术层划分src/ ├── controllers/ │ ├── OrderController.java │ ├── UserController.java │ └── ProductController.java ├── services/ │ ├── OrderService.java │ ├── UserService.java │ └── ProductService.java ├── repositories/ │ ├── OrderRepository.java │ ├── UserRepository.java │ └── ProductRepository.java └── entities/ ├── Order.java ├── User.java └── Product.java特点所有 Controller 放一起所有 Service 放一起所有 Repository 放一起。代码按技术职责归类。风格 B按领域模块划分src/ ├── order/ │ ├── entity/ │ ├── service/ │ ├── repository/ │ └── event/ ├── user/ │ ├── entity/ │ ├── service/ │ ├── repository/ │ └── event/ └── product/ ├── entity/ ├── service/ └── repository/特点每个业务领域独占一个文件夹内部再按技术层细分。代码按业务归属归类。二、两种都算 DDD 吗严格来说两种都可以算 DDD。DDD 的核心在于战略设计限界上下文、通用语言和战术设计聚合、实体、值对象、领域事件等并没有强制规定文件夹必须怎么组织。只要你的代码遵循了聚合隔离、分层架构等原则文件夹结构属于实现细节。但——按领域模块划分才是 DDD 社区推荐的做法。原因往下看。三、为什么按模块分更优维度按技术层分按领域模块分可读性找一个功能需要跨 3-4 个文件夹打开一个文件夹就能看到完整业务维护性修改一个功能改动散落各处改动集中在一个目录内扩展性新增模块的文件分散在各层新建一个文件夹即可拆分微服务需要大量重构抽离直接把文件夹拎出去聚合隔离容易跨聚合乱引用天然形成物理隔离边界团队协作多人改同一文件夹冲突频繁各团队各守一个模块目录核心原因与 DDD 的限界上下文天然契合DDD 强调聚合之间在代码上应当完全隔离聚合之间通过应用层协调。按模块划分文件夹让限界上下文在物理结构上可见。一个文件夹就是一个限界上下文或聚合边界清清楚楚。而按技术层划分时这个边界是隐性的全靠开发者自觉——时间一长跨模块调用必然泛滥。四、为什么还有人按技术层分几个常见原因MVC 惯性从 Spring MVC / Rails 等框架入门习惯了 controller-service-dao 三层结构迁移到 DDD 时直接照搬。项目规模小只有 2-3 个实体时按模块分反而显得过度设计按层分更简洁直观。“伪 DDD”口头上说在做 DDD实际思维还是面向数据库的 CRUD时间一长项目会退化成披着 DDD 外衣的 MVC。框架脚手架默认生成很多脚手架默认生成的就是按层分的结构开发者没有主动调整。五、推荐的项目结构结合 DDD 四层架构 按模块划分推荐如下结构src/ ├── interfaces/ # 用户接口层对外暴露 │ ├── rest/ │ │ ├── OrderController.java │ │ └── UserController.java │ └── dto/ │ ├── application/ # 应用层用例编排不含业务逻辑 │ ├── order/ │ │ └── OrderApplicationService.java │ └── user/ │ └── UserApplicationService.java │ ├── domain/ # 领域层核心业务逻辑 │ ├── order/ # 订单限界上下文 │ │ ├── entity/ │ │ │ ├── Order.java │ │ │ └── OrderItem.java │ │ ├── valueobject/ │ │ │ └── Money.java │ │ ├── event/ │ │ │ └── OrderCreatedEvent.java │ │ ├── repository/ │ │ │ └── OrderRepository.java # 接口定义 │ │ └── service/ │ │ └── OrderDomainService.java │ │ │ └── user/ # 用户限界上下文 │ ├── entity/ │ ├── valueobject/ │ ├── repository/ │ └── service/ │ └── infrastructure/ # 基础设施层技术实现 ├── persistence/ │ ├── OrderRepositoryImpl.java │ └── UserRepositoryImpl.java ├── messaging/ └── config/这个结构的好处领域层是绝对核心不依赖任何外部框架每个限界上下文一个文件夹边界清晰架构演进友好将来拆微服务时domain/order/整个目录迁移即可新人友好看目录结构就能理解业务划分六、什么时候用哪种场景建议项目只有 1-3 个实体且不会扩展按技术层分就够了别过度设计中大型项目多个业务领域按模块分必须的团队多人协作按模块分减少代码冲突预期未来要拆微服务按模块分提前做好物理隔离学习 DDD 初期练手直接用按模块分养成好习惯七、总结结论说明两种都算 DDDDDD 不强制规定文件夹结构但按模块分是推荐做法让限界上下文在代码物理结构上可见按技术层分的本质问题业务边界隐性化长期维护成本高一句话原则代码结构应该反映业务结构而不是技术结构如果打开你的项目目录一个不懂技术的产品经理都能大概看出这里是订单、这里是用户、这里是商品那你的代码组织就对了。如果你正在从传统 MVC 项目向 DDD 转型第一步不妨就从调整文件夹结构开始——把散落在各技术层的同一业务代码收拢到同一个模块目录下。这一步虽然简单但对团队理解领域边界的帮助是立竿见影的。

相关文章:

DDD 中的代码组织:按技术层分 vs 按领域模块分,哪种才是正解?

前言 在实践领域驱动设计(DDD)时,你可能见过两种截然不同的代码组织方式:一种是传统的按技术层划分文件夹,另一种是按业务模块划分文件夹。两种写法的人都声称自己在做 DDD,那到底哪种更合理?本…...

从CDP“3A”到千亿美元目标:联想集团的创新路径与AI原生转型

在全球产业链加速重构、人工智能技术范式快速迭代的背景下,中国企业的创新能力正成为各界关注的焦点。当被问及“哪些中国企业创新做得不错”时,有一家科技企业凭借其在绿色低碳、供应链协同以及混合式人工智能领域的系统性突破,给出了具有说…...

油雾净化设备哪家技术更专业

在机械加工、五金锻造、热处理等工业生产场景中,机床切削、乳化液喷淋、高温加工会持续产生大量工业油雾。悬浮在车间内的油雾不仅会腐蚀生产设备、污染生产环境,还会刺激人体呼吸道,危害操作人员身体健康,同时超标排放还会违反环…...

解密Palantir系列一:1. 决策的三元闭环

解密Palantir系列一:1. 决策的三元闭环 第一性问题企业真正缺的是更多数据,还是让数据变成正确行动的闭环?很多人第一次理解 Palantir,会把它归类成“大数据公司”“AI 公司”“可视化工具”或“咨询公司”。这些说法都只碰到了一…...

如何做好费用率数据分析?巧用费用率研判企业盈利现状

企业经营发展过程中,盈利水平高低直接决定长远发展实力,而费用率数据是看透企业真实盈利水平最直观、最核心的指标。很多经营者在日常管理中,往往只看重账面营收的增长,却忽略了费用率数据的深层分析与解读,最终出现营…...

(QBuffer配合 QDataStream)二进制序列化

QByteArray arr; QBuffer buf(&arr); buf.open(QIODevice::WriteOnly); QDataStream out(&buf); out << QString(“hello”) << 123; // 序列化 // 反序列化 buf.seek(0); QDataStream in(&buf); QString s; int n; in >> s >> n;...

VMware虚拟机安装及配置

密码 # 设置 root 用户密码 sudo passwd root修改国内镜像源 在 Ubuntu 24.04 之前&#xff0c;Ubuntu 的软件源配置文件路径为 /etc/apt/sources.list&#xff1b;从 Ubuntu 24.04 开始&#xff0c;Ubuntu 的软件源配置文件变更为 DEB822 格式&#xff0c;路径为 /etc/apt/so…...

专业做绝对值编码器的服务商

在工业自动化领域&#xff0c;绝对值编码器是不可或缺的关键组件。它能够直接输出轴或直线运动的“绝对位置”&#xff0c;断电后位置信息不会丢失&#xff0c;每次上电都能立刻知道当前的精确坐标&#xff0c;这使得其在各种精密应用中具有无可替代的优势。本文将通过具体数据…...

《从 0 实现 SGLang》第 1 篇 · LLM 推理引擎到底在做什么

千行代码&#xff0c;一步步搭出一个现代 LLM 推理引擎&#xff0c;吃透大模型推理的每一项关键技术。 本阶段目标 — 最简推理实现 用最朴素的方式把端到端推理跑通&#xff1a;先搭起整体框架&#xff0c;再逐个模块替换为完整实现。整个阶段共 5 篇短文&#xff1a; 序号…...

2026年必看:六款热门AI编程工具横评,Trae与Cursor怎么选

2026年必看&#xff1a;六款热门AI编程工具横评&#xff0c;Trae与Cursor怎么选AI编程工具正从辅助插件进化为全流程开发核心&#xff0c;2026年市场进入智能体协作新阶段。本文精选6款主流AI编程工具&#xff0c;从核心功能、协作模式、适配场景等维度深度解析&#xff0c;帮开…...

第一学期结果

关注 1.从安涛老师前三期视频中了解了方向2.从b站了解了555的内部结构3.仿真。4.低通滤波器的基本原理&#xff1a;一、核心定义只允许低频信号顺利通过&#xff0c;阻挡、衰减高频信号的电路。 你电路里作用&#xff1a;滤掉方波里的高频谐波&#xff0c;留下低频基波&#xf…...

2026.5.21【MIPI D-PHY】一、D-PHY 简介

一、简介 MIPI&#xff1a;全称移动行业处理器接口&#xff08;Mobile Industry Processor Interface&#xff09;。MIPI是由MIPI联盟发起的为移动应用处理器制定的开放标准。 MIPI可分为物理层和逻辑层两大部分。 MIPI按照物理层&#xff08;Physical Standard&#xff09;划分…...

由一次构建 OpenEuler 22.03 dnf源所了解到的

零、说在前面今天在安装 Milvus 的时候&#xff0c;因为部分插件下载过慢&#xff0c;需要重建国内 yum/dnf 源&#xff0c;按照常规的方式重建后报出了一些奇怪的报错。通过这些报错让我了解到了 OpenEuler 22.03 的不同版本在构建 yum/dnf 源的时候是存在区别的。因此将我的处…...

Delft3D建模、水动力模拟方法及地表水环境影响评价:岸线绘制与导入、非结构化计算网格生成、水下地形数据处理等前处理操作;水动力与污染物对流扩散模拟的参数设置、边界条件设定及模型率定验证

查看原文>>>https://mp.weixin.qq.com/s/_CiPDK_oXaAGxVfu2qk6ew 前言 本文以地表水数值模拟软件Delft3D 4.03.00操作为主要内容&#xff0c;强调地表水水动力建模、基础资料的获取、边界条件设定、模型率定和验证、数据分析和处理等关键环节。通过对案例模型的实操…...

Token聚合平台 vs 传统云 vs AI原生云,AI推理应用怎么选?

在大模型能力深度融入生产环境的当下&#xff0c;后端 AI 架构的选择往往决定了应用的生死。从早期的“调用一个接口”到如今复杂的智能体&#xff08;Agent&#xff09;工作流&#xff0c;开发团队在底座选型上面临着两条截然不同的演进路径&#xff1a;一条是追求便利与极致轻…...

windows VS2026 编译32位 onnxRuntime

打开命令行终端&#xff0c;执行以下命令克隆官方仓库并初始化子模块&#xff08;--recursive 参数非常重要&#xff0c;否则会因为缺少依赖导致编译失败&#xff09;&#xff1a;git clone --recursive https://github.com/microsoft/onnxruntime.git进入目录&#xff1a;cd o…...

影刀RPA 从0到1:自动化系统架构收敛与工程化演进总结

影刀RPA 从0到1&#xff1a;自动化系统架构收敛与工程化演进总结 作者&#xff1a;林焱 写到这里。 这个系列其实已经慢慢进入后半段了。 前面聊了很多内容。 包括&#xff1a; 浏览器池 节点集群 Redis 队列 调度系统 容灾恢复 日志监控 性能治理 很多人刚开始接…...

2026年想做美缝施工?专业靠谱的美缝施工究竟哪家好?

在装修领域&#xff0c;美缝施工虽看似是小工程&#xff0c;却对家居整体美观度和实用性影响重大。然而&#xff0c;美缝行业乱象丛生&#xff0c;让众多业主在选择美缝施工团队时犯了难。2026年若想做美缝施工&#xff0c;怎样才能选到专业靠谱的团队呢&#xff1f;下面为大家…...

从低空协议劫持实战看 MAVLink 二进制审计在飞控发布环节的必要性

攻防实测复盘&#xff1a;协议劫持漏洞成因解析无人机接管攻击的本质不是高危漏洞&#xff0c;而是协议与生俱来的默认信任逻辑。近期多项低空攻防实测中&#xff0c;攻击者依托通用射频采集设备&#xff0c;即可持续捕获空口无线交互数据&#xff0c;实现对飞行设备的非正常控…...

谷歌AI掌门竟是死敌大股东!“DeepMind黑手党”四年卷走140亿美元

谷歌AI掌门竟是死敌大股东&#xff0c;“DeepMind黑手党”四年卷走140亿美元&#xff01;就在刚刚&#xff0c;全球科技圈爆出惊人消息——谷歌AI最高掌门人、DeepMind创始人、诺贝尔奖得主Demis Hassabis&#xff0c;被挖出是其最大死敌、超级独角兽Anthropic的早期隐秘金主&a…...

GPT5.5每次推理只激活部分参数MoE路由策略完整拆解

做多模型架构对比测试时用了cc.877ai.cn这个AI模型聚合平台&#xff0c;一站接入多个模型方便对比不同架构策略在实际任务中的表现差异。GPT-5.5是OpenAI首个从零完整重训的基础模型。大多数人关注"变强了多少"但更值得关注的是"怎么变强的"。MoE路由策略是…...

SpaceX披露IPO招股书:400亿美元数据中心交易、600亿美元收购Cursor,轨道AI计算挑战待解

拿下Anthropic算力大单&#xff1a;每月12.5亿美元&#xff0c;连付3年&#xff0c;双方均可叫停今年5月&#xff0c;SpaceX与Anthropic就访问COLOSSUS和COLOSSUS II两大大型数据中心的算力访问达成了云服务协议。根据协议&#xff0c;Anthropic同意在2029年5月之前每月向Space…...

大二学完 MyBatis 再学 MyBatis-Plus,我踩过的 10 个坑

作者&#xff1a;逆境不可逃 技术永无止境 希望我的内容可以帮助到你&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本节目属于专栏《后端新手谈》&#xff1a;https://blog.csdn.net/2401_87662859/category_13141790.html 大家吼 ! 我是 逆境不可逃 今天给…...

OpenAI通用推理模型攻克80年数学难题,跨领域推理能力引发科学研究范式变革!

极其简单的谜题&#xff0c;与阻挡人类80年的高墙要理解这项突破有多么不可思议&#xff0c;我们必须先回到1946年。那一年&#xff0c;20世纪最伟大的传奇数学家之一保罗埃尔德什&#xff08;Paul Erdős&#xff09;提出了一个几何问题&#xff1a;如果在二维平面上任意画下n…...

Mardi 品牌创始人是谁?一文读懂法国 Mardi Ladin

法国 Mardi Ladin 品牌创始人是La Bergon&#xff08;Baudino Cd L&#xff09;&#xff0c;一位出身法国时尚世家的设计师&#xff0c;品牌的灵感直接来自于 1975 年法国经典电影《表兄妹》中入围奥斯卡最佳女主角的角色 "玛尔蒂 MARDI"。创始人 La Bergon 解析La B…...

2026年,IP地理位置精准查询的几个硬核技术变化

关于IP定位相关最近和几个同行交流&#xff0c;发现大家对IP定位的理解还停留在之前&#xff0c;想把自己这段时间的一些实践整理出来&#xff0c;希望能给同样在搞网络或风控的同行一些参考。 IPv6流量超过IPv4、住宅代理攻击泛滥、CGNAT覆盖越来越广……这些变化正在悄悄改变…...

python 内存管理 内存泄漏及排查方案 内存友好的python代码

Python 内存管理 一、一句话总结 Python 的内存管理就是三件事&#xff1a; 自动分配内存&#xff08;你不用管变量存在哪&#xff09;自动回收垃圾&#xff08;不用的对象自动删掉&#xff09;靠引用计数 分代垃圾回收实现二、核心机制 1&#xff1a;引用计数&#xff08;最基…...

解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践

解锁.NET 11 新境&#xff1a;ASP.NET Core 10 在微服务安全通信的深化与实践 前言 在当今分布式系统盛行的时代&#xff0c;微服务架构已成为构建大型应用的主流选择。ASP.NET Core 10 作为.NET 11 生态中重要的后端框架&#xff0c;为微服务间的安全通信提供了全面且强大的支…...

为什么你的ElevenLabs马来文输出总像“机器人朗读”?资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的ElevenLabs马来文输出总像“机器人朗读”&#xff1f;资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板 马来语&#xff08;Bahasa Melayu&#xff09;虽属声调中性语言&#xff0c;…...

【AI入门知识点】Skills 是什么?终于有人把 Skills、Function Calling、MCP 讲明白了

为什么现在 AI 会查天气&#xff1f;为什么 AI 能读 Excel、操作浏览器、发邮件&#xff1f;为什么很多人说&#xff1a;未来 AI 拼的不是谁更聪明&#xff0c;而是谁 Skills 更多&#xff1f;很多刚学 AI 的人。都会被几个词搞晕&#xff1a;SkillsFunction CallingMCP看起来都…...