为什么要把数据模型分为:Entity,DTO,Response,Request呢?具体有什么作用呢
开发中,我们通常把数据模型分为几个部分,探讨下他们具体都有那些作用。
1. Entity(实体)
实体类代表数据库表结构,与数据库表一一对应。
// 例如 User.cs
public class User : BaseEntity
{
public string Username { get; set; }
public string Password { get; set; }
// ...
}
主要特点:
- 代表数据库表的实体类,与数据库表结构一一对应
- 包含数据库字段的完整定义,如主键、外键、索引等
- 通常带有 ORM 相关的特性标注(Table、Column 等)
- 可以包含实体间的导航属性,表示表之间的关系
- 不应该直接暴露给外部接口,因为可能包含敏感信息(如密码)
2. DTO(数据传输对象)
用于在不同层之间传输数据的对象。
// 例如 UserDto.cs
public class UserDto
{
public long Id { get; set; }
public string Username { get; set; }
// 不包含密码等敏感字段
}
主要特点:
- 用于在不同层之间传输数据的对象
- 通常是实体类的精简版,只包含需要传输的字段
- 可以组合多个实体的数据
- 去除了敏感信息,更安全
- 可以添加额外的展示字段,更适合业务需求
3. Request(请求模型)
专门用于接收 API 请求的数据模型。
// 例如 CreateUserRequest.cs
public class CreateUserRequest
{
[Required]
public string Username { get; set; }
[Required]
public string Password { get; set; }
}
主要特点:
- 专门用于接收 API 请求的数据模型
- 包含数据验证特性(如 Required、StringLength 等)
- 只包含客户端需要提交的字段
- 可以根据不同的操作(增、删、改)定义不同的请求模型
- 更好地控制客户端可以提交的数据范围
4. Response(响应模型)
统一的 API 响应格式。
// 例如 ApiResponse.cs
public class ApiResponse<T>
{
public int Code { get; set; }
public string Message { get; set; }
public T? Data { get; set; }
}
主要特点:
- 统一的 API 响应格式
- 包含状态码、消息等通用字段
- 可以包装任意类型的响应数据
- 便于统一处理成功/失败的响应
- 有利于前端统一处理响应结果
分层的主要好处
1. 关注点分离
- 每种模型都有其特定的职责
- 不同层级使用不同的模型,避免耦合
2. 安全性
- 实体类中的敏感信息不会直接暴露
- 可以控制客户端能够访问的数据范围
3. 灵活性
- 可以根据不同场景使用不同的模型
- 数据库结构变化时,只需修改实体类
4. 可维护性
- 代码结构清晰,易于理解和维护
- 便于进行单元测试
- 便于处理版本升级和 API 变更
5. 验证和转换
- 请求模型可以进行数据验证
- DTO 可以进行数据转换和组合
实际开发中的数据流向
A[客户端请求] --> B[Request模型]
B --> C[业务处理]
C --> D[Entity实体]
D --> E[数据库]
E --> F[Entity实体]
F --> G[DTO转换]
G --> H[Response模型]
H --> I[客户端响应]
这种模式虽然看起来代码量增加了,但是带来的好处远大于维护成本,特别是在大型项目中更为明显。
为什么要把数据模型分为:Entity,DTO,Response,Request呢?具体有什么作用呢的更多相关文章
- 当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?
当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...
- EntityFramework 学习 一 创建实体数据模型 Create Entity Data Model
1.用vs2012创建控制台程序 2.设置项目的.net 版本 3.创建Ado.net实体数据模型 3.打开实体数据模型向导Entity Framework有四种模型选择 来自数据库的EF设计器(Da ...
- axios token header response request http拦截器 axios实现登录、拦截、登出
axios token header response request http拦截器 axios实现登录.拦截.登出 一个项目学会前端实现登录拦截 https://github.com/superm ...
- java架构之项目结构(entity / DTO / VO)
定义类的讲究 关系示例 定义类的讲究 ejb Enterprise JavaBean(EJB),企业javaBean.是java的核心代码,分别是会话Bean(Session Bean).实体Bean ...
- 超全面的JavaWeb笔记day10<Response&Request&路径&编码>
1.Response 2.Request 3.路径 4.编码 请求响应流程图 response 1.response概述 response是Servlet.service方法的一个参数,类型为java ...
- Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)
PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...
- 记录:http协议+response+request+session+cookie
1.http协议 http协议也叫作超文本传输协议,定义了浏览器向怎样向服务器请求资源和服务器怎样将资源传给浏览器.http协议是面向事务的应用层协议,是万维网能够传递资源的可靠保障. 目前http协 ...
- javaweb:Response/Request的概述 (转发、重定向、get/post)转
请求响应流程图 1]response 1 response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...
- Servlet(Response,Request)
1.response控制码表的3种方法:输出1; 2,文件下载 3.控制浏览器定时刷新网页(REFRESH) 4.控制浏览器缓存当前文档内容 5. 通过response实现请求重定向. 6.setHe ...
- response ,request编码
request.setCharacterEncoding()是你设置获得数据的编码方式.response.setCharacterEncoding()是你响应时设置的编码.response.setCo ...
随机推荐
- 链表反转(反转全部,前n个,中间)
链表反转 反转全部 // 迭代 struct ListNode *reverseList(struct ListNode *head) { struct ListNode *pre = NULL; s ...
- Machine Learning Week_1 Welcome
目录 0 Welcome 0.1 Video: Welcome to Machine Learning! Transcript unfamiliar words 0.2 Reading: Machin ...
- DRF-Throttle组件源码分析及改编源码
1. 限流组件源码分析 注意:以下源码为方便理解已进行简化,只保留了与限流组件相关的代码.注释前的数字代表执行顺序. SimpleRateThrottle类的源码解析: 2. 实践:编写一个限流类 f ...
- Next.js 从零入门到实战 3:2024最新完整教程 | 包含SSR、API路由和性能优化
CSS样式学习 上一篇文章讲到如何创建一个脚手架程序,目前我们已经有了一个nextjs的基本框架,因此我们可以在这个基础上进行改造.打开我们项目中的page.tsx页面,这里是程序的主页面,也就是我们 ...
- C++之OpenCV入门到提高003:矩阵的掩膜(Mask)处理
一.介绍 今天是这个系列<C++之 Opencv 入门到提高>得第三篇文章.今天这篇文章也不难,主要介绍如何使用 Opencv 对图像进行掩膜处理,提高图像的对比度.在这个过程中,我们可以 ...
- Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)
前言 本来想着给自己放松一下,刷刷博客,慕然回首,线程.程序.进程?Java 序列化?Java 中 IO 流? Java IO与 NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题 ...
- reg文件书写规则
reg文件可以很方便地用来修改注册表,这里记录一下reg文件的书写规则. 注释 分号(;)后面的内容是注释,导入时会忽略这些内容. 文件基本格式 首行写: Windows Registry Edito ...
- 4G模组PSM+超低功耗,手把手教你!
合宙4G-Cat.1模组支持三种功耗模式: 常规模式 低功耗模式 PSM+模式 用户可以根据不同的应用场景,按需选择不同的合宙4G-Cat.1模组功耗模式,以及三种功耗模式之间的相互转换. 合宙 ...
- (Python基础教程之十一)Python找到最大的N个(前N个)或最小的N个项目
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- Collections Framework中的算法(之三)--不可变装饰器相关
本篇主要讲述Collections类中的unmodifiable相关的方法!这些方法都有一个共同含义就是使用此方法创建的对象都是不可变的!典型的装饰器模式的应用!下面的几篇都是装饰器模式在Java C ...