首页 > 其他分享 >为什么要把数据模型分为:Entity,DTO,Response,Request呢?具体有什么作用呢

为什么要把数据模型分为:Entity,DTO,Response,Request呢?具体有什么作用呢

时间:2025-01-05 16:00:12浏览次数:1  
标签:set DTO string get -- Request public 数据模型

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

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[客户端响应]

这种模式虽然看起来代码量增加了,但是带来的好处远大于维护成本,特别是在大型项目中更为明显。

标签:set,DTO,string,get,--,Request,public,数据模型
From: https://www.cnblogs.com/wxb8/p/18653418

相关文章

  • requestAnimationFrame是宏任务还是微任务?为什么?
    requestAnimationFrame既不是宏任务(macro-task)也不是微任务(micro-task),但它通常被视为一个特殊的“宏任务”。以下是对这一观点的详细解释:定义与特性:宏任务:在JavaScript的事件循环中,宏任务包括整体代码script、setTimeout、setInterval、I/O、UI渲染等。它们会在每个事件循环......
  • Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析
    全文链接:https://tecdat.cn/?p=38617原文出处:拓端数据部落公众号摘要: 本文聚焦于图注意力网络GAT在蛋白质-蛋白质相互作用数据集中的应用。首先介绍了研究背景与目的,阐述了相关概念如归纳设置与转导设置的差异。接着详细描述了数据加载与可视化的过程,包括代码实现与分析,如数......
  • Java包中DTO,VO, 实体类的区别
    在软件开发中,实体类、VO(ValueObject)和DTO(DataTransferObject)是常见的三种类,它们各自有不同的用途和含义。下面是它们之间的主要区别:1.实体类(EntityClass)实体类通常表示数据库中的一张表或某个持久化对象。在ORM(如Hibernate、MyBatis等)框架中,实体类用来映......
  • 三个域对象->Request域、Session域、Application域
    Servlet中的三个域对象请求域:request会话域:session应用域:application三个域都有以下三个方法://向域中存储数据voidsetAttribute(Stringname,Objectobj);​//从域中读取数据ObjectgetAttribute(Stringname);​//删除域中的数据voidremoveAttribute(Strin......
  • C# 中HttpWebRequest发起HTTP请求,如何设置才能达到最大并发和性能
    前言在C#中使用HttpWebRequest发起HTTP请求时,达到最大并发和性能可以从以下几个方面改进:1、ServicePointManager设置ServicePointManager类是一个静态类,它提供了用于管理HTTP连接的属性和方法。为了提升并发性能,你需要调整以下几个关键属性:DefaultConnectionLimit:默认情况......
  • Object.freeze冻结属性和v-if结合requestAnimationFrame分帧渲染解决白屏
    计算100W条数据的长度造成2s延迟<template><div><h1>数据总长度{{arrList.length}}</h1></div></template><script>exportdefault{data(){return{arrList:[]}},created(){cons......
  • C#服务化存储解决方案中的数据模型设计:构建高效、可扩展的企业级应用
    在当今数字化转型的浪潮中,企业对于数据处理的需求日益增长,传统的单体架构已经难以满足现代应用程序对性能和灵活性的要求。为了应对这一挑战,越来越多的企业开始转向微服务架构,并探索如何利用C#及其强大的.NET生态系统来实现高效的服务化存储解决方案。本文将深入探讨基于C#......
  • WPF GeneralTransform3DTo2D TransformToAncestor
    //xaml<Windowx:Class="WpfApp113.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • [Java/网络/HTTP(S)] 基于`Http(s)URLConnection`的网络请求工具(HttpRequestUtils)
    1序轻量级HTTP网络请求工具,接续:[JavaSE/JDK/网络]核心源码精讲:java.net.HttpURLConnection-博客园/千千寰宇[身份认证/JWT]身份认证方案与HTTP请求中AuthorizationHeader-博客园/千千寰宇【推荐】[网络/HTTPS/Java]PKI公钥基础设施体系:数字证书(X.509)、CA机构......
  • HTTP 请求 (Request)
    ///<summary>///获取Token请求///</summary>///<paramname="urlStr">接口地址</param>///<paramname="value">页眉参数</param>///<paramname="requestData">请求参数</param>///<r......