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

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

1. Entity(实体)#

实体类代表数据库表结构,与数据库表一一对应。

Copy
// 例如 User.cs public class User : BaseEntity { public string Username { get; set; } public string Password { get; set; } // ... }

主要特点:#

  • 代表数据库表的实体类,与数据库表结构一一对应
  • 包含数据库字段的完整定义,如主键、外键、索引等
  • 通常带有 ORM 相关的特性标注(Table、Column 等)
  • 可以包含实体间的导航属性,表示表之间的关系
  • 不应该直接暴露给外部接口,因为可能包含敏感信息(如密码)

2. DTO(数据传输对象)#

用于在不同层之间传输数据的对象。

Copy
// 例如 UserDto.cs public class UserDto { public long Id { get; set; } public string Username { get; set; } // 不包含密码等敏感字段 }

主要特点:#

  • 用于在不同层之间传输数据的对象
  • 通常是实体类的精简版,只包含需要传输的字段
  • 可以组合多个实体的数据
  • 去除了敏感信息,更安全
  • 可以添加额外的展示字段,更适合业务需求

3. Request(请求模型)#

专门用于接收 API 请求的数据模型。

Copy
// 例如 CreateUserRequest.cs public class CreateUserRequest { [Required] public string Username { get; set; } [Required] public string Password { get; set; } }

主要特点:#

  • 专门用于接收 API 请求的数据模型
  • 包含数据验证特性(如 Required、StringLength 等)
  • 只包含客户端需要提交的字段
  • 可以根据不同的操作(增、删、改)定义不同的请求模型
  • 更好地控制客户端可以提交的数据范围

4. Response(响应模型)#

统一的 API 响应格式。

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

实际开发中的数据流向#

客户端请求
Request模型
业务处理
Entity实体
数据库
Entity实体
DTO转换
Response模型
客户端响应

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

posted @   Monns  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
点击右上角即可分享
微信分享提示
CONTENTS