问题描述
我对 nestJS 完全陌生。我已经看到在 nestJS 中,创建了一个模型来指定数据的详细信息,例如在创建一个简单的任务管理器时,当我们想要指定单个任务的外观时,我们在模型中指定(示例如下):
export interface Task {
id: string;
title: string;
description: string;
status: TaskStatus;
}
export enum TaskStatus {
OPEN = 'OPEN',IN_PROGRESS = 'IN_PROGRESS',DONE = 'DONE',}
但是,我后来遇到了 DTO,其中再次描述了数据的形状。我的理解是在传输数据时使用 DTO,即它描述了您将发布或获取的数据类型。
我的问题是,当我已经使用 DTO 来描述数据的形状时,为什么还要使用模型?
此外,我读到使用 DTO 我们可以拥有单一的事实来源,如果我们意识到数据结构需要更改,我们不必在控制器和服务文件中单独指定它,但是,这仍然意味着我们必须更新模型吗?
解决方法
在很长一段时间内的大部分时间里,您的 DTO 和您的模型可能并且将会彼此不同。来自 HTTP 请求的内容和返回的内容可以采用与数据库中保存的格式不同的格式,因此随着时间的推移,将它们分开可以带来更大的灵活性。这基本上涉及 DTO (Data Transfer Objects) 和 DAO (Data Access Object) 与 DTAO(数据传输/访问对象)(至少我是这么称呼它们的)的争论。
这也处理 Single Responsibility Principle,因为每个类都应该处理一件事,而且只处理一件事。
There's also this SO post from a Java thread that talks about what you're thinking of