数据传输对象

在计算机编程中，数据传输对象 (data transfer object，DTOMSDN (2010). Data Transfer Object. Microsoft MSDN Library. Retrieved from https://msdn.microsoft.com/en-us/library/ms978717.aspx .Fowler, Martin (2010). Data Transfer Object. Patterns of Enterprise Application Architecture. Retrieved from http://martinfowler.com/eaaCatalog/dataTransferObject.html .)是在2个进程中携带数据的对象。因为进程间通信通常用于远程接口（如web服务）的昂贵操作。成本的主体是客户和服务器之间的来回通信时间。为降低这种调用次数，使用DTO聚合本来需要多次通信传输的数据。

DTO与业务对象或数据访问对象的区别是：DTO的数据的变异子与访问子（mutator和accessor）、语法分析（parser）、序列化（serializer）时不会有任何存储、获取、序列化和反序列化的异常。即DTO是简单对象，不含任何业务逻辑，但可包含序列化和反序列化以用于传输数据。即DTO仅包含数据，不包含任何逻辑（logic）和行为（behavior）。逻辑（logic）和行为（behavior）指该类型的方法。对于C#，DTO只包含属性（property），这些属性只能读（get）、写（set）数据，不能对属性做验证（validate）或执行其他操作。

向DTO添加元数据以使其支持模型验证或类似目的的情况并不罕见。这不会向DTO本身添加任何行为，而是使能系统其他地方行为。 因此，它们并没有违反DTO不应包含任何行为的“规则”。

术语
值对象不是DTO。过去Sun/Java环境曾把二者混为一谈。

例子
public class ProductViewModel
{
  public int ProductId { get; set; }
  public string Name { get; set; }
  public string Description { get; set; }
  public string ImageUrl { get; set; }
  public decimal UnitPrice { get; set; }
}
参考文献

外部链接
Summary from Fowler's book 
Data Transfer Object - Microsoft MSDN Library 
GeDA - generic dto assembler is an open source Java framework for enterprise level solutions 
Local DTO 


Category:并发计算
Category:软件设计模式