我很想知道社区对这个问题的看法。我最近遇到了NHibernate / WCF场景(实体在服务层持久存在)的问题,并意识到我可能在这里走错了方向。
我的问题很明显,当在Web服务(在这种情况下为WCF)后面使用持久对象图(NHibernate,LINQ to SQL等)时,您更喜欢通过网络发送这些实体吗?或者你会创建一组较轻的DTO(没有循环引用)吗?
答案 0 :(得分:8)
DTO的。使用AutoMapper进行对象到对象的映射
答案 1 :(得分:3)
我以前曾经多次参加这个场景,可以从双方的经验谈起。最初我只是序列化我的实体并按原样发送它们。从功能的角度来看,这样做很好,但是我越是深入研究它,我就越发现我发送的数据超出了我的需要,而且我无法改变任何一方的实现。在后续的服务应用程序中,我采用了创建DTO,其唯一目的是从Web服务获取数据。
在任何互操作之外,不得不考虑通过线路发送的所有字段对我来说是非常有帮助的,以确保我不发送不需要或更糟的数据,不应该下来给客户。
正如其他人所提到的,AutoMapper是实体进行DTO映射的绝佳工具。
答案 2 :(得分:1)
我几乎总是创建dtos来通过线路传输并在我的服务器和客户端上使用更丰富的实体。在客户端,他们将拥有一些通用的表示逻辑,而在服务器上,他们将拥有业务逻辑。 dtos和实体之间的映射可能很愚蠢,但它需要发生。 AutoMapper等工具可以帮助您。
答案 3 :(得分:1)
如果您要求我将序列化实体从Web服务发送到外部世界?那么答案绝对不是,如果你这样做,你将获得最小的互操作性。 DTO通过定义一组可以用任何语言实例化的“对象”来帮助解决这个问题,无论您使用的是C#,Java,Javascript还是其他任何语言。
答案 4 :(得分:1)
我总是遇到通过线路发送nHibernate对象的问题。特别是如果您使用ActiveRecord模型。和/或如果你的对象与会话有关系(yuck)。另一个令人讨厌的结果是nHibernate可能会尝试在方法的入口处加载对象(在你可以到达它之前),这也可能导致问题。
所以...在这里收到消息?问题,问题...... DTO一路走来