一、今日学习目标
- 分清 Entity / DTO / VO 到底是什么
- 安装 + 配置 AutoMapper
- 用 Profile 配置映射规则 Profile 完整用法
- 把所有接口 改成:不直接返回实体,统一返回 VO/DTO
- 学会字段名不同、嵌套对象、列表的映射
二、核心概念(极简版)
1. 三个对象到底干嘛的?
表格
| 对象 | 全称 | 作用 | 位置 |
|---|---|---|---|
| Entity | 实体 | 对应数据库表 | Domain |
| DTO | 数据传输对象 | 接收前端参数 | Application |
| VO | 视图对象 | 返回给前端的数据 | Application |
一句话:前端 → DTO → Service → Entity → Service → VO → 前端
2. AutoMapper 干什么?
自动把:
- User → UserVO
- UserCreateDto → User
- List<User> → List<UserVO>
不用再写:
cs
var vo = new UserVO();
vo.Id = user.Id;
vo.Name = user.Name;
三、高频面试题 + 答案
1. 为什么要用 AutoMapper?
答案:
- 减少重复赋值代码
- 让业务代码更干净
- 支持复杂类型、嵌套映射
- 企业标准,提升开发效率
2. DTO 和 VO 有什么区别?
答案:
- DTO:前端传给后端(入参)
- VO:后端返回给前端(出参)
- Entity:数据库实体,绝不直接返回给前端
3. AutoMapper 映射规则是什么?
答案 :默认按字段名相同映射,不区分大小写:
- User.Name → UserVO.Name
- User.CreateTime → UserVO.CreateTime
字段名不同可以用 ForMember 配置。
4. 什么是 Profile?
答案 :统一存放所有映射规则的配置类,方便维护。
5. 可以映射子对象吗?
答案:可以,自动映射嵌套类,也可以手动配置。
四、今日实战练习:所有接口使用 AutoMapper(必须完成)
练习目标
把你Day19 的所有用户接口全部升级:
- Controller 不接收 Entity,只接收 DTO
- Service 不返回 Entity,只返回 VO
- 全部使用 AutoMapper 映射
- 禁止任何手动
.Id=xx .Name=xx赋值
你必须创建这些类
1. DTO(前端 → 后端)
- UserCreateDto
- UserUpdateDto
- UserPageQueryDto
- LoginDto
2. VO(后端 → 前端)
- UserVO
- UserDetailVO(带角色)
- RoleVO
- PageVO 分页统一返回
3. 映射配置
- AutoMapperProfile:配置所有映射
4. 改造全部接口
- 新增:接收 UserCreateDto → 映射成 User
- 查询:返回 UserVO / UserDetailVO
- 分页:返回 PageVO<List<UserVO>>
规范要求
- Entity 绝不暴露到前端
- 所有入参出参都用 DTO/VO
- 映射全部交给 AutoMapper
- Controller、Service 无手动赋值