当前位置: 首页 > 知识库问答 >
问题:

DTO到域模型转换策略

詹杰
2023-03-14

我目前正在开发一个restful API。NET Web API,并有一个域模型(使用实体框架)和一个DTO模型发送给客户端。

显然,API中的域模型和DTO模型之间存在一些映射。

API中我的一个控制器是Employee控制器,您可以对其执行所有CRUD操作。我创建了一个EmployeeDto对象用于控制器-例如,它可能如下所示:

public class EmployeeDto
{
   public Guid Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
}

我的控制器可能有以下动作html" target="_blank">方法:

public EmployeeDto Get(Guid employeeId)
{
...
}

我的难题是,是否适合为控制器中的每个操作使用相同的DTO类,还是为每个操作创建不同的DTO(例如,NewEmployeeDto、ExistingEmployeeDto)。

使用同一DTO的一个问题是,DTO的某些成员可能不适合(或冗余)某些操作。例如,上面的EmployeeDto实例可能会传递给下面的操作,但它的Id成员没有意义,因为只有在将域对象持久化到存储时才会生成Id。Id成员仅应在Dto发送回客户端时使用。

public void CreateEmployee(EmployeeDto employee)
{
...
}

以上不是问题,因为我们只是不将DTO的Id属性映射到我们的域对象,但我想知道是否最好创建一个名为NewEmployeeDto的新DTO,该DTO仅在CreateEmployee方法中使用,看起来像这样:

public class NewEmployeeDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

我看到的问题是,如果需求发生变化,并且需要向DTO添加额外的数据,那么您可能必须在三个不同的类中进行相同的更改:ReturnEmployeeDto、NewEmployeeDto、ExistingEmployeeDto。因此,在某些情况下,维护量增加了两倍。

共有2个答案

微生俊健
2023-03-14

在我看来,DTO不应该像值对象一样具有标识。我所做的是,如果创建和更新DTO是相同的,那么使用单个DTO。我的命名约定是使用"Edit"后缀,例如雇员编辑

API将是:

public EmployeeEdit New(); // new employee default values
public Guid Create(EmployeeEdit input);
public EmployeeEdit Edit(Guid id); // populate edit form
public void Update(Guid id, EmployeeEdit input);
public void Delete(Guid id);
鲁霄
2023-03-14

对于您描述的情况,可以共享相同的DTO,如果某些属性没有意义,可以忽略它们。

仅仅因为New雇员没有ID,就将New雇员和Existing雇员分成两个独立的类是大材小用的。

 类似资料:
  • 使用Spring MVC,我们通常会看到控制器、服务和存储库层。仓库层使用实体模型,实体模型与数据库是一对一的映射。我想过跟着- 服务层应该使用相同的实体模型吗? 服务层应该使用单独的域模型吗?如果是,那么到/到来回映射应该在服务层完成? 控制器层我们应该使用相同的域模型吗? 控制器层应该使用单独的DTO模型吗?如果是,那么到/来回映射应该在控制器层完成? 我们有什么简单的方法可以在不写太多冗长代

  • 我们正在用SpringBoot创建RESTAPI。我们的项目中有三层(存储库、服务和控制器)。 假设我有GetUser api在我的控制器返回对象。 是否返回对象,还是返回对象,并在控制器中转换为对象?哪种方法更好? 简而言之,域对象到DTO对象的转换,应该在服务层还是控制器层进行?

  • 你可以将你的模型从一种数据库类型转换为另一种数据库类型,例如:转换 MariaDB 10.0 物理模型为 PostgreSQL 9.0物理模型。 在转换過程中,所有数据类型会自动转换。如果从一个数据库类型转换为另一种,转换进程不会改变视图的 SQL 语法。而目标数据库版本是 MySQL 4.0 或以下,所有视图会移除。 若要转换一个已打开的模型文件,选择 文件 -> 模型转换。然后,选择目标 数据

  • Navicat Data Modeler 让你转换你的模型,从一种数据库类型转换为另一种数据库类型,以及从一种模型类型转换为另一种模型类型。例如:转换 MariaDB 10.0 物理模型为 PostgreSQL 9.0 物理模型,转换 Oracle 10g 物理模型为一个逻辑模型,转换一个概念模型为 MySQL 5.0 物理模型。 在转换进程中,所有数据类型会自动转换。如果从一个数据库类型转换为另

  • Navicat Data Modeler 让你转换你的模型,从一种数据库类型转换为另一种数据库类型,以及从一种模型类型转换为另一种模型类型。例如:转换 MariaDB 10.0 物理模型为 PostgreSQL 9.0 物理模型,转换 Oracle 10g 物理模型为一个逻辑模型,转换一个概念模型为 MySQL 5.0 物理模型。 在转换进程中,所有数据类型会自动转换。如果从一个数据库类型转换为另

  • Navicat 让你将你的模型从一种数据库类型转换为另一种数据库类型,例如:转换 MariaDB 10.0 物理模型为 PostgreSQL 9.0 物理模型。 在转换进程中,所有数据类型会自动转换。如果从一个数据库类型转换为另一种,转换进程不会更改视图的 SQL 语法。而目标数据库版本是 MySQL 4.0 或以下,所有视图会移除。 当使用 Navicat Premium 时,你还可以将模型从一