实施 DTO 的最佳方式是什么?
我的理解是它们是在对象之间传输数据的一种方式。例如,在 ASP.Net 应用程序中,您可能使用 DTO 将数据从代码隐藏发送到业务逻辑层组件。
其他选项呢,比如将数据作为方法参数发送?(这在要发送的数据较少的情况下最容易吗?)
一个只保存数据的静态类,可以被其他对象引用(一种全局汇编数据存储类)呢?(这是否会过多地破坏封装?)
每次传输都使用一个通用 DTO 怎么样?使用起来可能有点麻烦,但减少了需要使用的类的数量(减少了对象混乱)。
感谢您分享您的想法。
实施 DTO 的最佳方式是什么?
我的理解是它们是在对象之间传输数据的一种方式。例如,在 ASP.Net 应用程序中,您可能使用 DTO 将数据从代码隐藏发送到业务逻辑层组件。
其他选项呢,比如将数据作为方法参数发送?(这在要发送的数据较少的情况下最容易吗?)
一个只保存数据的静态类,可以被其他对象引用(一种全局汇编数据存储类)呢?(这是否会过多地破坏封装?)
每次传输都使用一个通用 DTO 怎么样?使用起来可能有点麻烦,但减少了需要使用的类的数量(减少了对象混乱)。
感谢您分享您的想法。
我使用 DTO 来:
“一个 DTO 来统治它们”方法可能会变得混乱,最好的办法是为每个特性/特性组使用特定的 DTO,注意命名它们,以便它们易于在它们所使用的特性之间进行匹配。
我从未以您提到的方式看到过静态 DTO,并且会犹豫创建您所描述的 DTO 单例。
我保持简单并将一个 DTO 类映射到一个数据库表。它们很轻,所以我可以将它们发送到任何地方,包括通过电线发送。
我希望它可以这么简单。尽管 DTO 源于系统的网络分布层,但如果将域对象返回到视图层,则可能会出现大量问题。这里是其中的一些:
1.通过将域对象暴露给视图层,视图可以了解域对象的结构,这让视图可以对相关对象如何可用做出一些假设。例如,如果域对象“Person”被返回到它“绑定”到的视图,而在其他一些视图上,Person 的“地址”将被绑定,应用程序层将倾向于使用类似的语义person.getAddresse() woukd 失败,因为此时地址域对象可能尚未加载。本质上,随着域对象对视图层可用,视图总是可以对数据如何可用做出假设。
2.) 当域对象绑定到视图时(在胖客户端中更是如此),以视图为中心的逻辑总是会潜入这些对象中,使它们在逻辑上被破坏。
基本上,根据我的经验,我已经看到使域对象可用于视图会产生架构问题,但是使用 DTO 也存在问题,因为使用 DTO 在创建汇编程序(DTO 到域对象和反向)方面会产生额外的工作,类似的对象,例如 Patient 域对象、Patient DTO 以及可能绑定到视图的 Patient bean。
显然,在一个胖客户端系统中,这个问题没有正确的答案。
我借用了这个简短但不完整但对 DTO 陈词滥调的真实答案:
http ://www.theserverside.com/discussions/thread.tss?thread_id=32389#160505
我认为使用 DataSet/DataTable 作为“一个 DTO 来统治它们”是很常见的。很容易从数据库中加载它们,并将值持久化,并且它们可以很容易地序列化。
我肯定会说它们使用起来更麻烦。它们确实提供了所有的管道,但是针对它们进行编程是一种痛苦(大量的强制转换、空检查、魔术字符串等)。看到一组很好的扩展方法使使用它们更“自然”会很有趣。
DTO 用于通过线路而不是对象之间发送数据。看看这篇文章: POCO vs DTO
感谢所有有用的想法...
总结+我对此的看法:
--如果要移动的数据量很少,而且要移动的地方不多,则常规参数可能就足够了
--如果有很多数据和/或许多对象要移动到,特别创建的对象可能是最简单的(DTO 对象)。
——一个可以被各种对象引用(而不是传递)的全局数据对象似乎不受欢迎……但是,我想知道在特定的子系统中是否有时没有它的位置?这是减少数据传递量的一种方法。它确实推动了“良好封装”的极限,但是在特定层内的特定实例中,也许它可以为特定的类组合增加简单性。因此,一个人将失去类级别的封装,但仍可能具有程序集级别的封装。