DTO (Data Transfer Object) 是一个对象,它定义了如何通过网络或应用程序发送数据。另一方面,Response Object 通常保存来自 DTO 或 WebApi's or Data Access 的响应数据或对客户端的任何其他响应。
Response Object 通常包含特定 model or entity or DTO 的所有/少数属性,该特定 model or entity or DTO 通常是 DTO 对象的子集。请看下面的例子。
员工响应对象:
public class EmployeeResponseObject
{
public int Id { get; set; }
public string Name { get; set; }
public string Designation { get; set; }
}
员工 DTO:
public class EmployeeDTO
{
public int Id { get; set; }
public string Name { get; set; }
public string Designation { get; set; }
public decimal Salary { get; set; }
public DateTime JoiningDate { get; set; }
public decimal Tax { get; set; }
}
现在你可以在这里看到。 EmployeeResponseObject 是 EmployeeDTO 的一个子集,这意味着 EmployeeResponseObject 具有较少来自 EmployeeDTO 的属性。在少数情况下,我们不必将所有信息传递给最终客户端。所以我们将使用EmployeeResponseObject 从EmployeeDTO 获取所需的属性。
您可以使用LINQ 将数据从DTO 投影到Response Object。
[ResponseType(typeof(EmployeeResponseObject))]
public EmployeeResponseObject GetEmployee()
{
var employee = from e in dbContext.EmployeeDTO
select new EmployeeResponseObject()
{
Id = e.Id,
Name = e.Name,
Designation = e.Designation
};
return employee;
}
如果您只使用EmployeeDTO 将信息传递给presentation layer/View, Webforms or ConsoleApp,那么您的presentation layer/View 将与您的domain layer 紧密耦合。对DTO Objects 所做的任何更改都需要您更改presentation layer or controllers,这不是一个好方法。
有时DTO 和Response Objects 会完全相同,那么为什么要使用单独的对象。
这可能看起来是不必要的代码重复,但想想当你的项目变得更大时,特别是在一个大团队中,许多人在不同的应用程序层上一起工作。在这里使用DTO 和separate Response object 对于良好的编程实践更有意义。当您跳过使用 ResponseObject/ViewModelObject 时,Presentation layer/View 和 domain layer 将变得紧密耦合。