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