我目前正在.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。因此,在某些情况下,维护量会增加三倍。
答案 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);