Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何有效地使用DTO对象(数据传输对象)?_Asp.net_Design Patterns_Oop_Dto - Fatal编程技术网

Asp.net 如何有效地使用DTO对象(数据传输对象)?

Asp.net 如何有效地使用DTO对象(数据传输对象)?,asp.net,design-patterns,oop,dto,Asp.net,Design Patterns,Oop,Dto,实现DTO的最佳方式是什么 我的理解是,它们是在对象之间传输数据的一种方式。例如,在ASP.Net应用程序中,您可以使用DTO将数据从代码隐藏发送到业务逻辑层组件 那么其他选项呢,比如仅仅将数据作为方法参数发送?(当需要发送的数据较少时,这在asces中是最容易的吗?) 一个只保存数据的静态类(一种全局asembly数据存储类)怎么样?(这是否会过度破坏封装?) 每次传输使用一个通用DTO如何?使用起来可能会有点麻烦,但是减少了需要使用的类的数量(减少了对象混乱) 谢谢分享您的想法。我保持简单,

实现DTO的最佳方式是什么

我的理解是,它们是在对象之间传输数据的一种方式。例如,在ASP.Net应用程序中,您可以使用DTO将数据从代码隐藏发送到业务逻辑层组件

那么其他选项呢,比如仅仅将数据作为方法参数发送?(当需要发送的数据较少时,这在asces中是最容易的吗?)

一个只保存数据的静态类(一种全局asembly数据存储类)怎么样?(这是否会过度破坏封装?)

每次传输使用一个通用DTO如何?使用起来可能会有点麻烦,但是减少了需要使用的类的数量(减少了对象混乱)


谢谢分享您的想法。

我保持简单,并将一个DTO类映射到一个db表。它们很轻,因此我可以将它们发送到任何地方,包括通过电线。

我使用DTO来:

  • 在标准三层应用程序的UI和服务层之间传递数据
  • 将数据作为方法参数传递,以封装大量(5+)参数
“一个DTO来管理所有DTO”的方法可能会变得混乱,最好的办法是为每个功能/功能组指定特定的DTO,注意命名它们,以便它们在所使用的功能之间容易匹配


我从未见过您提到的静态DTO,在创建您描述的DTO单例时会犹豫。

我认为使用DataSet/DataTable作为“一个DTO来管理所有DTO”是非常常见的。很容易从数据库中加载它们,并将值持久化回来,而且它们可以很容易地序列化


我肯定会说它们使用起来更麻烦。它们确实提供了所有的管道,但是针对它们编程是一件痛苦的事情(大量的强制转换、空检查、魔术字符串等等)。如果能看到一套好的扩展方法,使使用它们更“自然”,那将是一件很有趣的事情。

感谢所有有用的想法

总结+我对这一点的看法:

--如果要移动的数据量很小,但移动的位置不太多,则常规参数就足够了

--如果有大量数据和/或许多对象要将其移动到,则特别创建的对象可能是最简单的(DTO对象)


--一个可以被各种对象引用(而不是传递)的全局数据对象似乎是不受欢迎的……然而,我想知道在一个特定的子系统中是否有时没有它的位置?这是减少数据传递量的一种方法。它确实突破了“良好封装”的限制,但是在特定层中的特定实例中,也许它可以为特定的类集合增加简单性。因此,可能会丢失类级封装,但仍可能具有程序集级封装。

DTO用于通过线路而不是在对象之间发送数据。查看此帖子:

我希望它能这么简单。虽然DTO起源于系统的网络分发层,但如果域对象返回到视图层,则可能会出现全部问题。以下是其中一些:

1.通过将域对象公开给视图层,视图可以了解域对象的结构,从而允许视图对相关对象的可用性做出一些假设。例如,如果一个域对象“Person”被重新绑定到一个它被“绑定”到的视图中,而在另一个视图中,Person的“Address”将被绑定,那么应用层将倾向于使用类似Person.getAddresse()的语义,这将失败,因为在该点上,Address域对象可能在该点上没有被加载。本质上,随着域对象可用于视图层,视图始终可以对数据的可用性做出假设

2.)当域对象绑定到视图(在厚客户端中更是如此)时,以视图为中心的逻辑总是会在这些对象中爬行,使它们在逻辑上损坏

基本上,根据我的经验,我已经看到,使域对象可用于视图会产生架构问题,但DTO的使用也存在问题,因为DTO的使用会在创建汇编器(DTO到域对象和反向)方面产生额外的工作,类似对象(如患者域对象)的激增,患者DTO,可能还有绑定到视图的患者bean

显然,对于这一点,没有正确的答案,特别是在厚客户端系统中

我借用了这个简短而不完整但真实的答案来回答陈词滥调: