DTO与序列化持久化实体的区别

5
我很想知道社区对这个问题的看法。最近我遇到了一个NHibernate/WCF场景(实体持久化在服务层),意识到我可能走错了方向。
我的问题很简单,当在Web服务(WCF)后面使用持久对象图(NHibernate、LINQ to SQL等)时,你更喜欢通过网络发送这些实体吗?还是会创建一组轻量级的DTO(不包含循环引用)来传输数据?
5个回答

9

数据传输对象(DTOs)。使用AutoMapper实现对象之间的映射。


3
我之前多次遇到过这种情况,可以从两个方面分享我的经验。最初我只是将实体序列化并按原样发送。从功能角度来说,这很好用,但我越看越意识到我发送了比需要的更多的数据,并且我失去了在任一侧变化实现的能力。在后续的服务应用中,我开始创建DTO,其唯一目的是获取数据并与Web服务交互。
除了任何互操作性外,考虑被发送到网络的所有字段非常有助于我确保我不会发送不必要的数据,更糟糕的是,不应该传递给客户端的数据。
正如其他人提到的,AutoMapper是一个很好的实体到DTO映射工具。

1

我几乎总是创建DTO来在服务器和客户端之间传输数据,使用Richter实体。在客户端,它们将具有一些常见的展示逻辑,而在服务器上,它们将具有业务逻辑。DTO和实体之间的映射可能很简单,但必须进行。像AutoMapper这样的工具可以帮助您。


1
如果你问我是否从 Web 服务向外部发送序列化实体,那么答案绝对是否定的。如果这样做,你将得到最小的互操作性。DTO 可以通过定义一组“对象”来解决此问题,这些对象可以在任何语言中实例化,无论你是使用 C#、Java、Javascript 还是其他任何语言。

我同意。实际上这是一个内部服务(我们的内部应用程序使用它,我知道我没有具体说明),但概念是正确的。 - Alexis Abril

1

我一直有在发送nHibernate对象时遇到问题。特别是如果您使用ActiveRecord模型,和/或者如果您的对象与会话有关系(呕吐)。另一个令人讨厌的结果是,nHibernate可能会在方法入口处尝试加载对象(在您可以访问它之前),这也可能会导致问题。

所以...明白信息了吗?问题,问题,问题...DTO无处不在


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接