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

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

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

posted @ 2025-01-05 15:53 Monns 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 这是一个基于sass和tailwindcss的快速开发传统多页面的npm脚手架。 package.json { "name": "sass-tailwindcss-start", "version": "1.0.0", "description": "", "main": "index.js", " 阅读全文
posted @ 2022-02-16 08:48 Monns 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 背景 MVVMLight已多年未更新,Microsoft.Toolkit.Mvvm作为MVVMLight继任者,需要学习一下。 Microsoft.Toolkit.Mvvm跟MVVMLight使用非常相似,但是默认没有提供Ioc容器,我这里仿照MVVMLight使用DryIoc作为依赖注入记录下使用 阅读全文
posted @ 2021-11-22 23:05 Monns 阅读(1154) 评论(0) 推荐(2) 编辑
摘要: .翻译自:https://github.com/dotnet/designs/blob/master/accepted/2020/single-file/staging.md NET Core 3.0 中单文件应用程序的设计。 介绍 在 .NET Core 3.0 中实现阶段 1(在暂存文档中所述) 阅读全文
posted @ 2020-03-25 15:14 Monns 阅读(1530) 评论(0) 推荐(0) 编辑
摘要: 问题描述 layer弹出iframe,如果设置title为false,会自动设置closeBtn为2,也就是向右上方偏移了-28px,如果显示区域大于1100则正常,如果小于1100则会添加一段css代码,如下 @media screen and (max-width:1100px){.layui- 阅读全文
posted @ 2020-03-23 23:07 Monns 阅读(886) 评论(0) 推荐(0) 编辑
摘要: 可以使用Mono.Cecil库更新、添加可执行文件的资源 以下是使用 Mono.Cecil 进行资源操作的三种基本方法: 三种方法 您可以读取/写入或修改当前资源或创建新资源,然后只需通过调用 或添加它作为新资源调用即可将其放回可执行文件ResourceWriter、ResourceReader、R 阅读全文
posted @ 2020-03-01 15:07 Monns 阅读(1511) 评论(1) 推荐(0) 编辑
摘要: 一、编译发布Asp.net core 应用 直接使用vs2019编译发布后,通过ftp上传到centos的 /www/ 目录下,不再赘述。 二、centos安装asp.net core runtime和nginx 1、安装asp.net core runtime 2、安装nginx 添加源: 安装 阅读全文
posted @ 2020-02-24 23:23 Monns 阅读(2751) 评论(0) 推荐(1) 编辑
摘要: 在自定义TagHelper时,我们无法通过TagHelperContext 和 TagHelperOutput 获取到当前路由的信息,我们需要添加注入ViewContext 现在,我们可以访问路由数据并获取有关当前链接的信息: 阅读全文
posted @ 2019-12-16 01:10 Monns 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 问题描述: IIS站点错误会导致windows服务器启动vs调试,这在生产服务器是完全没必要的,会导致下面的问题,弹出一个调试框,必须手动关闭。很是不爽。。 关闭调试导入注册表: 恢复调试导入注册表,根据自己服务器调整程序路径: 阅读全文
posted @ 2019-12-07 21:56 Monns 阅读(633) 评论(0) 推荐(0) 编辑
摘要: <rewrite> <rules> <rule name="http to https" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF"/><addinput="HTTPHOST"pattern="" negat 阅读全文
posted @ 2019-12-05 22:28 Monns 阅读(972) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示