三层架构重构实录:我是如何把500行Controller拆干净的

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 136 浏览 25 回复

接手老项目时看到个"巨无霸"Controller,一个index方法足足500行代码,各种业务逻辑、数据校验、日志记录全揉在一起,改个需求就像在面条代码里找线头。这次重构我做了三件事:

1. Controller只做三件事:
- 接收请求参数(过滤XSS+基础校验)
- 调用对应Service
- 返回统一格式响应
把原来糅在Controller里的优惠券计算逻辑、库存校验统统抽到Service层

2. Service层严格遵循单一职责:
- 每个Service方法对应一个完整业务单元
- 使用DTO对象传递参数避免参数爆炸
- 事务控制放在这一层(避免在Controller里开事务)
比如把原来的订单创建拆成OrderCreateService,内部再细分为库存服务、优惠服务、支付服务三个子模块

3. Model层瘦身成纯数据管家:
- 只保留基础的CRUD操作
- 字段修改器/访问器移到Service层
- 关联查询用查询构造器单独处理
原来在Model里写的好几个自定义scope方法,现在改用Repository模式集中管理

踩坑提醒:
- 不要为了分层而分层(简单CRUD可以直接Model调用)
- Service之间避免环形调用(我的优惠服务调支付服务,支付服务又回调优惠服务,直接死循环)
- 跨服务操作记得加@Transactional注解(血的教训:本地测试OK,线上并发出现数据不一致)

重构后虽然多了十几个文件,但改需求时终于不用在屎山里淘金了。特别当需要加个新支付方式时,直接在PayService里新建策略类就行,原来要改三四处的逻辑现在只需动一个文件。

评论25
回复 · 25
NorthWind
NorthWind 新手 · #20 ·
支持了~
BrightPath
BrightPath 初级 · #19 ·
同求,期待更新
NightOwl
NightOwl 新手璃海华章 · #18 ·
学到了,顶一下
MilesWolf
MilesWolf 新手 · #17 ·
感谢分享!
安然77
安然77 初级心屿荧途 · #16 ·
感谢分享!
阿琛
阿琛 新手 · #15 ·
感谢分享!
小小的晚霞
小小的晚霞 初级 · #14 ·
已解决,谢谢楼主
唐凯婷
唐凯婷 新手 · #13 ·
同求,期待更新
何霞伟
何霞伟 新手 · #12 ·
写得很清楚,收藏了
Miles
Miles 新手漫步繁花 · #11 ·
学到了,顶一下
SkyWalker
SkyWalker 新手璃海华章 · #10 ·
写得很清楚,收藏了
胡宁华
胡宁华 初级星灿心语 · #9 ·
同求,期待更新
Blake
Blake 新手赏金猎人 · #8 ·
感谢分享!
小小的月亮
小小的月亮 新手赤羽栖云 · #7 ·
写得很清楚,收藏了
神秘的企鹅
神秘的企鹅 新手 · #6 ·
支持了~
IvySky
IvySky 初级 · #5 ·
支持了~
小满
小满 新手赏金猎人 · #4 ·
学到了,顶一下
发光的少年
发光的少年 初级 · #3 ·
支持了~
安静的柚子
安静的柚子 初级赤羽栖云 · #2 ·
学到了,顶一下
清醒的星星
清醒的星星 初级 · #1 ·
已解决,谢谢楼主
1 2
微信客服 微信客服