代码之家  ›  专栏  ›  技术社区  ›  Aaron

数据传输对象(DTO)的意义是什么?

oop
  •  7
  • Aaron  · 技术社区  · 15 年前

    当我可以将所有业务类放在类库中,在业务逻辑中使用它们,然后将这些相同的业务对象传递到边界类时,为什么要使用DTO/域对象?

    更新: 一切都很好,谢谢你的帮助。后续问题:

    您通常将这些DTO放在哪里?在同一个命名空间中的域对象旁边?

    namespace MedSched.Medical
    {
        public class MedicalGroup
        {
            //...
        }
    
        public class MedicalGroupDTO
        {
            //...
        }
    }
    
    4 回复  |  直到 9 年前
        1
  •  7
  •   Adam Fyles    15 年前
    • DTO为您的域模型提供了一个抽象层。因此,您可以更改模型,而不破坏您为服务客户所签订的合同。这类似于数据库设计中的一种常见做法,视图和过程成为底层数据模型的抽象层。
    • 序列化-您可能会过度暴露数据并通过网络发送膨胀的消息。这可以通过使用序列化属性来减轻,但您可能仍然有额外的信息。
    • 隐式契约和显式契约——通过公开域对象,您可以让客户机来解释它们的用法,因为它们没有可供使用的完整模型。您通常会根据关联的存在或删除隐式地更新域对象,或者盲目地接受所有更改。DTO显式地表示服务的用法和所需的操作。
    • 断开连接的场景-具有显式消息或DTO将使您更容易实现消息传递和消息传递模式,如消息代理等。
    • DDD—纯DDD要求域对象在外部是不可变的,因此您必须将其卸载到另一个对象,通常是DTO。
        2
  •  4
  •   Jon Limjap    15 年前

    我可以想到使用DTO的两个基本场景:

    • 您正在根据不完整的数据创建业务对象,这些数据将无法通过验证。 例如,您正在分析从中创建业务对象的csv文件或excel文件。如果直接使用这些对象中的数据来创建业务对象,则很可能会使对象中的多个验证规则失效,因为这些文件中的数据容易出错。它们的结构也与您在最终业务对象中的结构不同:为不完整的数据保留一个占位符将非常有用。

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

        3
  •  3
  •   Bob    15 年前

    DTO是数据传输对象,传输是关键字。当你想将你的对象通过线传递,并且可能与另一种语言通信时,它们是很好的,因为它们“重量轻”(即没有业务逻辑)。

    如果您的应用程序不是基于Web服务的,那么DTO不会真正为您购买任何东西。

    因此,决定使用或不使用DTO应该基于应用程序的体系结构。

        4
  •  1
  •   Pop Catalin    15 年前

    有时 数据 您想要传递的并不完全映射到业务对象的结构,在这种情况下,您使用DTO。

    例如:当您想要传递数据的一个子集或投影时。