数据传输对象(DTO)(Data Transfer Object),是一种
设计模式之间传输数据的软件
应用系统。数据传输目标往往是
数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。
远程调用(那些必须跨越网络的调用)速度缓慢。虽然许多远程调用框架可以隐藏进行远程调用的复杂性,但是它们不能消除发生通信所需的步骤。例如,必须先找到远程对象位置,而且建立与远程计算机的连接,然后才能将数据串行化为
字节流,然后可能进行加密,最后才能将其传输到远程计算机。
避免远程调用中固有的滞后
时间问题的最佳方法是进行更少的调用,并让每个调用传递更多的数据。做到这一点的一种方法是,使用长
参数列表来声明远程方法。这样,客户端就可以在单个调用中将更多的
信息传递给远程组件。但是,这样做会使针对此接口的编程容易出错,因为程序很可能仅按调用语句中的位置来调用
外部方法的参数。例如,如果远程方法接受 10 个字符串参数,则开发人员很容易按错误顺序传递参数。
编译器将无法检测到这样的错误。
长参数列表无助于从远程调用向客户端返回更多的信息,因为大多数的
编程语言将方法调用的返回类型限制为单个参数。而巧合的是,在传输大多数数据时通常需要返回较多信息。例如,许多
用户接口传输少量的信息,却希望返回大量结果数据。
DTO 是简单对象,它不应该
包含需要测试的任何
业务逻辑。但是,确实需要测试每个 DTO 的
数据聚合。每个 DTO 可能需要测试,也可能不需要,这取决于序列化机制。如果序列化是框架的一部分,则只需要测试一个 DTO。如果不是这样,请使用一般的
反射机制,这样就不需要测试每个 DTO 的序列化。
DTO 还对远程函数的
可测试性有好处。通过使远程方法的结果能够在对象实例中使用,可以轻松地将此
数据传递到测试模块,或将其与所需结果进行比较。
理想情况下,应该先筛选和验证从不可靠的来源获得的数据(如来自 Web 页的用户输入),然后将其置于 DTO 中。通过这样做,就可以认为 DTO 中的数据是相对安全的,从而简化了将来与 DTO 的交互。
接收 DTO 的进程和关联用户的安全凭据也是值得注意的。DTO 通常包含从许多不同来源聚集在一起的大量信息。是否已授权 DTO 的所有用户访问 DTO 所包含的所有信息?确保用户已得到授权的最佳方法是仅使用用户安全凭据所允许的特定数据填充 DTO。努力避免让 DTO 负责自己的安全性。这将增加 DTO 对其他类的依赖数,这意味着必须将这些类部署到使用 DTO 的所有节点。这还会将安全性功能分散到更多类中,从而增大了
安全风险,并对灵活性和
可维护性产生
负面影响。