WCF + NHibernate + Web服务软件工厂2010 - 请求反馈

时间:2011-07-18 13:22:56

标签: wcf web-services nhibernate orm fluent-nhibernate

我目前正在开发一个Web服务,它将用作Perforce服务器的外观。

换句话说,它们不是让客户端直接联系Perforce服务器,而是从Web服务发送和接收消息,而Web服务又将它们转发到Perforce服务器。这种分离主要是出于安全原因(即:客户端永远不能直接访问Perforce服务器)。

另一个要求是将Web Service连接到SQL Server数据库。在对ORM进行一些研究之后,我遇到了NHibernate。它似乎具有开发高效Web服务所需的所有功能,例如缓存和延迟加载。

我还发现了Web Service Software Factory 2010,据微软称,它是“一个集成的资源集合,旨在帮助您快速,一致地构建符合众所周知的架构和设计模式的Web服务”

以下是我的问题:

  1. 我注意到自2010年以来 Web Service Software Factory 尚未更新。如果框架未保持最新或已被弃用,我对使用它犹豫不决。我还注意到它没有为端点提供TCP连接,这是我想用来在Web服务和客户端之间传输数据的协议之一。 WSSF的适应性如何?我可以覆盖一些生成的代码吗?

  2. WCF和NHibernate一起运作良好吗?关于如何同时处理这两种技术,您有什么建议吗?我最关心的是如何在WCF环境中为NHibernate创建会话管理器。

  3. 由于性能是Web服务的基础,您是否建议我使用TCP协议而不是HTTP?如果我使用TCP,在WCF中是否有任何方法可以简单地序列化我想要在线路上传递的实体,而不是先将它们转换为SOAP格式?

  4. 由于这是我第一次使用WCF和NHibernate,因此手头任务的欢呼复杂性令人生畏。我已经为每项服务单独配备了一些好的教程,但是我没有找到一个所有这些都在一起工作的教程。

    如果您根据自己的技术经验提出任何建议/建议,我将非常感激。

    感谢您的时间和美好的一天。

1 个答案:

答案 0 :(得分:6)

1)Web服务软件工厂可能是您工具箱的有用补充,具体取决于您为项目使用的方法。我建议如果你正在采用契约优先方法进行项目(即你已经有XSD文件用于你的消息,或者你的团队中有人要预先设计你的消息和服务合同)那么WSSF可能有用。

我个人的经验是,这些工具并没有增加太多价值,但你的里程可能会有所不同。但是,如果这是您的第一个严肃的WCF项目,那么该指南值得一读。

2)如果你做得对,NHibernate和WCF可以成为梦之队。

使用ORM和WCF的最大阻抗不匹配之一是,可以从模型中的一个对象导航的对象模型通常很大,并且可以快速拖动数百或数千个相关对象。由于延迟加载和NHibernate的强大功能,很容易忽略服务实现对数据库的影响。

因此,我认为最重要的建议是避免通过网络发送/接收您的域模型对象,并小心设计您的DTO。这迫使您非常明确地考虑您在线上执行(或不执行)的数据以及实际需要导航的关系。也就是说,如果你有一个域对象A(使用NHibernate映射),理想情况下你会有不同的DTO版本支持A的不同客户端场景(例如BriefA,DetailedA,BsAssociatedWithA,PerformTask1OnA,PerformTask2OnA等)。当你提出这看起来有点矫枉过正,但从长远来看,它会节省你的时间,并为你提供一个更可预测和可维护的软件。

关于会话管理,有很多方法可以做到这一点,而且非常简单。 Here是一个很好的起点。

3)DTO的设计对性能也很重要。在仅封装所需数据的DTO与必须满足30种不同场景的膨胀域对象之间可以获得的性能差异可以达到数量级。

还可以使用标准的DataContract / DataMember属性来确保您的DTO可以使用内置的序列化程序。这些都非常快。

WCF的一个奇妙之处在于它能够通过简单的配置更改来转换Web服务的许多方面。从简单HTTP更改为SOAP消息传递,或从文本更改为二进制编码,或从net.tcp更改为http传输都可以通过轻松切换一两个开关来完成。这样可以非常轻松地进行实验并找到满足您要求的最佳配置。我的经验是net.tcp上的二进制编码在大多数情况下都能提供最好的结果,但有太多因素可以简单地假设这对你来说是最好的选择。

祝你好运!