项目架构(3)--- DTO(数据传输对象)

 

我们需要再学习 :

dto  辅助依赖  class-validator + class-transformer 官网

 

DTO

 

  是一个设计模式,主要用于在不同层或不同系统之间传递数据。DTO 的主要目的是将数据封装成一个对象,以便跨网络、不同模块或不同服务之间传输时,避免直接暴露底层的数据模型。

DTO 的特点:

  1. 封装数据:DTO 用来封装数据,它通常包含的是数据的属性,不包含业务逻辑。
  2. 跨层/跨系统传输:在应用架构中,DTO 常常用于不同的层(如:Controller 层和 Service 层之间)或者跨系统的通信(如:客户端与服务器之间)时传递数据。
  3. 简化数据交换:它可以避免直接传输复杂的实体对象,确保系统的安全性和解耦性。
  4. 适应不同需求:DTO 可以根据传输的需求做数据裁剪或转换,确保只传递必要的数据。

DTO 的使用场景:

  • 客户端与服务端通信:比如在 Web 开发中,前端和后端之间通过 HTTP 请求和响应传输的数据通常就是 DTO。
  • 层与层之间的数据传输:例如,在 MVC 架构中,Controller 和 Service 层之间通常会使用 DTO 来传递数据。
  • 微服务之间的通信:微服务之间进行数据传输时,通常会使用 DTO 来避免暴露内部的业务实体。

DTO 与实体(Entity)的区别:

  • Entity 通常是数据库中的数据模型,包含了更多的业务逻辑和数据库操作。
  • DTO 通常只是数据容器,不包含任何业务逻辑,旨在简化数据的传递。

示例:

// User 实体(包含业务逻辑和数据库字段)
class User {
    id: number;
    name: string;
    email: string;
    password: string; // 不应该暴露
}

// UserDTO(用于前端交互,只包含需要暴露的数据)
class UserDTO {
    id: number;
    name: string;
    email: string;

    constructor(user: User) {
        this.id = user.id;
        this.name = user.name;
        this.email = user.email;
    }
}

// 使用 DTO 来传递数据
const user = new User();
user.id = 1;
user.name = "John";
user.email = "john@example.com";
user.password = "secret";

// 创建 UserDTO 实例并返回给前端
const userDTO = new UserDTO(user);

 

 

相关依赖

1. class-validator

class-validator 是一个用于对类对象进行验证的库。它允许你在 DTO 中定义验证规则,确保数据的有效性。通过使用装饰器(例如 @IsString(), @IsInt() 等),你可以验证 DTO 中的数据是否符合预期的格式或规则。

示例:

import { IsString, IsInt, Min } from 'class-validator';

class CreateUserDTO {
  @IsString()
  username: string;

  @IsInt()
  @Min(18)
  age: number;
}

在这个例子中,class-validator 用来验证 CreateUserDTO 对象的 username 是否是字符串,age 是否是整数并且大于等于18。

 

2. class-transformer

class-transformer 是一个库,主要用于将普通的 JavaScript 对象转换为类的实例,或者将类的实例转换为普通的 JavaScript 对象。它可以自动转换数据的类型,并支持一些特殊的转换功能,比如属性重命名、嵌套对象的转换等。

示例:

import { plainToClass } from 'class-transformer';

class CreateUserDTO {
  username: string;
  age: number;
}

const plainObject = { username: 'John', age: 25 };
const userDTO = plainToClass(CreateUserDTO, plainObject);

plainToClass 函数将普通的 JavaScript 对象 plainObject 转换为 CreateUserDTO 类的实例。

 

DTO用来:

  1. 数据验证:通过 class-validator 检查数据的合法性。
  2. 数据传输:在不同层或组件之间传递数据。
  3. 数据转换:将普通的对象转换为类实例,能够使用类的方法和属性。
  4. 数据持久化:将 DTO 用作与数据库交互的数据模型。
  5. 提供增强的类型支持:确保类型安全和开发时的智能提示。

 

posted @ 2025-04-01 14:29  蜗牛般庄  阅读(97)  评论(0)    收藏  举报
Title
页脚 HTML 代码