DTO与序列化持久实体

我很想知道社区对这个问题的看法。 我最近遇到了NHibernate / WCF场景(实体在服务层持久存在)的问题,并意识到我可能在这里走错了方向。

我的问题很明显,当在Web服务(在这种情况下为WCF)后面使用持久对象图(NHibernate,LINQ to SQL等)时,您更喜欢通过网络发送这些实体吗? 或者你会创建一组较轻的DTO(没有循环引用)?

DTO的。 使用AutoMapper进行对象到对象的映射

我以前曾经多次参加这个场景,可以从双方的经验谈起。 最初我只是序列化我的实体并按原样发送它们。 从function的角度来看,这样做很好,但是我越是深入研究它,我就越发现我发送的数据超出了我的需要,而且我无法改变任何一方的实现。 在后续的服务应用程序中,我采用了创建DTO,其唯一目的是从Web服务获取数据。

在任何互操作之外,不得不考虑通过线路发送的所有字段对我来说是非常有帮助的,以确保我不发送不需要或更糟的数据,不应该发送到客户端。

正如其他人所提到的, AutoMapper是实体到DTO映射的一个很好的工具。

我几乎总是创建dtos来通过线路传输并在我的服务器和客户端上使用更丰富的实体。 在客户端,他们将拥有一些通用的表示逻辑,而在服务器上,他们将拥有业务逻辑。 dtos和实体之间的映射可能很愚蠢,但它需要发生。 AutoMapper等工具可以帮助您。

如果您要问我是否将序列化实体从Web服务发送到外部世界? 那么答案绝对不是,如果你这样做,你将获得最小的互操作性。 DTO通过定义一组可以用任何语言实例化的“对象”来帮助解决这个问题,无论您使用的是C#,Java,Javascript还是其他任何东西。

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

所以…在这里收到消息? 问题,问题…… DTO一路走来