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

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. Nuxt.js 应用中的 build:manifest 事件钩子详解

    title: Nuxt.js 应用中的 build:manifest 事件钩子详解 date: 2024/10/22 updated: 2024/10/22 author: cmdragon exce ...

  2. 全中国有多少公网IP地址?

    之前为了准备CTF比赛,搞了一个云服务器,顺便申请了一个公网IP. 看着申请到的IP地址,我突然想到了一个问题:不是早就说IP地址已经耗尽了吗,为什么我随便就能申请到,是谁在负责IP地址的管理分配,咱 ...

  3. Ubuntu中Conda建立环境和删除环境

    网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片化的东 ...

  4. Avalonia跨平台上位机控件开发之水泵

    Avalonia跨平台上位机控件开发之水泵 随着国产化的推进,越来越多的开发者选择使用跨平台的框架来创建上位机应用,而Avalonia正是一个优秀的选择.本文将探讨如何利用Avalonia框架进行水泵 ...

  5. 万字长文带你深入Redis底层数据结构

    Redis数据库的数据结构 Redis 的键值对中的 key 就是字符串对象,而 value 就是指Redis的数据类型,可以是String,也可以是List.Hash.Set. Zset 的数据类型 ...

  6. 【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题

    问题描述 通过FTP的方式,把本地能正常运行的Python Function文件上传到云上后,无法加载函数列表问题. 1:上传 function_app.py,requirements.txt文件到 ...

  7. Python通过requests模块处理form-data请求格式

    1.安装 requests_toolbelt 模块,引入该模块下的 MultipartEncoder 2.在 请求体 中使用该模块函数,请求头中增加对应参数值 from requests_toolbe ...

  8. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解()

    转载自:http://blog.csdn.net/walkerjong/article/details/7946109 学习了下,对@RequestBody,@SessionAttributes,@M ...

  9. 小白PDF阅读器重排版时的自动提取背景色功能介绍及实现

    小白PDF阅读器在1.35之前的版本对于有深色背景的页面重拍版时并不太完美.对于深色背景区域主要表现在不能分割排版和重排后页面元素割裂感明显.小白PDF阅读器在1.35版本主要针对这两个问题进行了优化 ...

  10. CSS 样式百分比

    1.宽高百分比 元素宽度/高度百分比是基于父级元素的width/height,不包含padding,border 注意:高度百分比一定要求父元素有设置height属性,只设置 min-height 虽 ...