2009-04-08 23 views
7

为什么我应该使用DTOs/Domain对象,只需将所有业务类放入类库中,在业务逻辑中使用它们,然后将这些相同的业务对象传递给边界类?数据传输对象(DTO)的要点是什么?

更新: 所有是伟大的观点,感谢您的帮助。后续问题:

你通常在哪里放置这些DTO?除了Domain对象之外,即在同一个命名空间中?

namespace MedSched.Medical 
{ 
    public class MedicalGroup 
    { 
     //... 
    } 

    public class MedicalGroupDTO 
    { 
     //... 
    } 
} 

回答

7
  • 的DTO的为您的域模型的抽象层。因此,您可以更改模型并且不违反您为服务客户提供的合同。这类似于数据库设计中的常见做法,其中视图和过程成为基础数据模型的抽象层。
  • 序列化 - 您可能会过度暴露数据并通过线路发送臃肿消息。这可以通过使用序列化属性来缓解,但是您可能仍然有额外的信息。
  • 隐式与显式合同 - 通过暴露域对象,您可以将其留给客户来解释他们的使用情况,因为他们没有完整的模型供他们使用。您经常会根据关联的存在或删除情况隐式更新域对象,或者盲目接受所有更改。 DTO明确表达了服务的使用和所需的操作。
  • 断开连接的场景 - 有明确的消息或DTO的会使你更容易实现消息和消息模式,例如消息代理等
  • DDD - 纯DDD要求该域对象是不可改变的外部,因此,你必须卸载这到另一个对象,通常是一个DTO。
3

DTO的是数据传输对象,与转移是关键字。如果你的应用程序不是基于web服务的,那么DTOs aren()就不会有效,因为它们是“轻量级的”(即没有业务逻辑)。

如果你的应用程序不是基于web服务的,真的不想给你买东西。

所以决定使用还是不使用DTO应该基于您的应用程序的体系结构。

+0

有意义 - 是的,特定的应用程序是一个高度分布的应用程序。感谢您的意见。 – Aaron 2009-04-08 00:14:28

1

有些时候,您要传递的数据没有完全映射到业务对象的结构,在这种情况下您使用DTO。例如:当你想传递数据或投影的一个子集时。

4

我能想到的2个基本情景使用的DTO:

  • 您正在从数据业务对象那是不完整的,将无法通过验证。例如,您正在解析创建业务对象的CSV文件或Excel文件。如果直接从这些对象中使​​用数据来创建业务对象,则很可能会在对象中失败多个验证规则,因为来自这些文件的数据容易出错。他们也倾向于在最终的业务对象中拥有不同的结构:为这些不完整的数据设置占位符将会很有用。

  • 您正在通过带宽密集的媒介传输业务对象。如果您使用的是Web服务,则需要在运输之前使用DTO来简化对象;否则CLR将很难尝试序列化所有数据。

相关问题