开发中,我们通常把数据模型分为几个部分,探讨下他们具体都有那些作用。

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 可以进行数据转换和组合

实际开发中的数据流向

graph LR
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呢?具体有什么作用呢的更多相关文章

  1. 当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

    当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...

  2. EntityFramework 学习 一 创建实体数据模型 Create Entity Data Model

    1.用vs2012创建控制台程序 2.设置项目的.net 版本 3.创建Ado.net实体数据模型 3.打开实体数据模型向导Entity Framework有四种模型选择 来自数据库的EF设计器(Da ...

  3. axios token header response request http拦截器 axios实现登录、拦截、登出

    axios token header response request http拦截器 axios实现登录.拦截.登出 一个项目学会前端实现登录拦截 https://github.com/superm ...

  4. java架构之项目结构(entity / DTO / VO)

    定义类的讲究 关系示例 定义类的讲究 ejb Enterprise JavaBean(EJB),企业javaBean.是java的核心代码,分别是会话Bean(Session Bean).实体Bean ...

  5. 超全面的JavaWeb笔记day10<Response&Request&路径&编码>

    1.Response 2.Request 3.路径 4.编码 请求响应流程图 response 1.response概述 response是Servlet.service方法的一个参数,类型为java ...

  6. Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)

    PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...

  7. 记录:http协议+response+request+session+cookie

    1.http协议 http协议也叫作超文本传输协议,定义了浏览器向怎样向服务器请求资源和服务器怎样将资源传给浏览器.http协议是面向事务的应用层协议,是万维网能够传递资源的可靠保障. 目前http协 ...

  8. javaweb:Response/Request的概述 (转发、重定向、get/post)转

    请求响应流程图 1]response 1   response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...

  9. Servlet(Response,Request)

    1.response控制码表的3种方法:输出1; 2,文件下载 3.控制浏览器定时刷新网页(REFRESH) 4.控制浏览器缓存当前文档内容 5. 通过response实现请求重定向. 6.setHe ...

  10. response ,request编码

    request.setCharacterEncoding()是你设置获得数据的编码方式.response.setCharacterEncoding()是你响应时设置的编码.response.setCo ...

随机推荐

  1. Linux Ubuntu 安装Python独立的不同版本

    由于Ubuntu系统默认的Python版本基本为3.5.2,老掉牙的版本了,很多功能语法不可以使用,删除也并不好操作.所以不如新装一个最新的版本.速度快,操作简单,最重要的是使用只需要键入python ...

  2. 汉文博士 0.5.9 测试版发布:增加统一码中日韩表意文字扩展 G 区的构型检索和 GB/T2312、GBK字表

    之前我们采用的构型数据库在 2019 年起未见更新,但我最近在该数据库的页面找到了该数据库的基础数据源(CHISE),而该数据源上提供了中日韩表意文字扩展 G 区的构型数据.这样,在构型检索中支持扩展 ...

  3. TypeError: fs.existsSync is not a function | import { ipcRenderer } from 'electron'

    在electron的渲染进程中导包会发生TypeError: fs.existsSync is not a function node_modules/electron/index.js:6 var ...

  4. 干货分享:开启PWM调光之门,一起来做呼吸灯

    PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制.灯光调光.音频信号生成.加热控制等应用. 本文将以合宙低功耗4G模组经典型号--Air780E为例, ...

  5. Air780E软件指南:UDP应用示例

    一.UDP概述 UDP(用户数据报协议,UserDatagramProtocol)是一种无连接的.不可靠的传输层协议,主要用于实现网络中的快速通讯.以下是UDP通讯的主要特点: 1.1 无连接通讯: ...

  6. Apache APISIX 和 Kong 的选型对比

    从 API 网关核心功能点来看,两者均已覆盖: 功能 Apache APISIX Kong 动态上游 支持 支持 动态路由 支持 支持 健康检查和熔断器 支持 支持 动态SSL证书 支持 支持 七层和 ...

  7. 《Django 5 By Example》阅读笔记:p237-p338

    <Django 5 By Example>学习第11天,p237-p338总结,总计102页. 一.技术总结 1.follow system(关注功能) 表之间的关系有三种:OneToOn ...

  8. 深入JUnit源码之Runner

    初次用文字的方式记录读源码的过程,不知道怎么写,感觉有点贴代码的嫌疑.不过中间还是加入了一些自己的理解和心得,希望以后能够慢慢的改进,感兴趣的童鞋凑合着看吧,感觉JUnit这个框架还是值得看的,里面有 ...

  9. Java语言的动态性支持

    一.脚本语言的支持     JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式.JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.scri ...

  10. 子组件监听props中的值,监听不到旧值的相关问题

    昨天,在项目中做一个功能,一个tab切换,点击其中一个tab的时候,调用组件中的查询方法,切只调用一次.再次切换的时候不再调用. 我的做法是: 在父组件中创建一个变量,初始化data中设为0,在点击t ...