DTO到域模型转换策略

时间:2013-11-19 18:05:21

标签: .net asp.net-web-api dto

我目前正在.NET Web API中开发一个restful API,并且有一个域模型(使用Entity Framework)和一个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; }
}

我的控制器可能有以下操作方法:

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

我的困境在于是否适合为控制器中的每个操作使用相同的DTO类,或者是否为每个操作创建不同的DTO(例如,NewEmployeeDto,ExistingEmployeeDto)。

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

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

以上不是问题,因为我们根本没有将DTO的Id属性映射到我们的域对象,但我想知道创建一个名为NewEmployeeDto的新DTO是否更好,它只用于CreateEmployee方法,看起来像这样:

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

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

2 个答案:

答案 0 :(得分:3)

对于您描述的案例,可以共享相同的DTO,如果它们毫无意义,则忽略某些属性。

将NewEmployee和ExistingEmployee分成两个单独的类只是因为NewEmployee没有Id,这样做会有点过分。

答案 1 :(得分:0)

在我看来,DTO不应该像Value Objects那样拥有身份。我所做的是,如果创建和更新DTO相同,则使用单个DTO。我的命名约定是使用“编辑”后缀,例如EmployeeEdit

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);