在Prism桌面应用程序中配置和托管WCF服务

时间:2012-02-14 22:56:26

标签: c# wpf wcf hosting prism

我的申请目前由两种不同的解决方案组成。

1)包含所有WPF和前端逻辑的Shell 2)BackEnd包含所有WCF服务实现和NHibernate相关的数据访问。目前,已定义了6种不同的WCF服务合同。

我目前在Visual Studio中运行良好,但需要考虑将应用程序安装到用户PC时的部署选项。据我所知,有许多不同的方式来托管WCF服务 - 在进程中,作为Windows服务,在IIS中。我很想知道人们如何在Prism应用程序中配置这种类型的设置。

我到目前为止找到的最近的信息来自http://wcfguidanceforwpf.codeplex.com/releases/view/27987,但我认为这不是我想要的。

我想知道: -

a)如何以及如果您允许用户为WCF服务选择不同的托管策略?
b)我看到的所有示例都显示ServiceHost打开并启动一项服务。这是推荐的做法,我必须创建6个服务主机,或者我可以在一个ServiceHost中启动六个WCF服务吗? c)例如,如果WCF服务正在运行以进行本地测试 - 您是否使用Shell中的引导程序并打开所有6个WCF服务,或者是否还有其他地方发生这种情况?
d)您使用什么策略来配置端点,或者仅仅是修改app.config文件的情况?
e)如果有任何体面的参考在线或书籍,我还没有找到覆盖Prism桌面/ WCF配置?

对问题的数量表示道歉但通常我可以通过广泛的Google搜索来拼凑我需要做的事情,但在这种情况下,除了上面的链接之外我找不到任何与我需要知道相符的内容。

对任何问题的任何帮助都将非常感激。

亚历

2 个答案:

答案 0 :(得分:2)

首先我要说Prism和WCF是相互排斥的框架,使用一个框架并不排除以任何方式使用另一个框架。

a)为什么要让他们决定如何托管他们的WCF服务?最简单的配置是IIS托管,这需要最少的设置。一个IIS Web可以托管您的所有六个服务,除非您需要将每个服务放在一个单独的应用程序池中,因此需要内存屏障。在服务主机中运行服务等同于编写EXE(例如Windows服务)来为客户端提供服务。更多的工作和配置(从Windows服务端,WCF配置是相同的,除非它通过在HTTP上运行与IIS冲突:80)。您有很多选择,但是您使用的是WCF,因此我假设您有一个客户端/服务器方案。如果您有Windows服务器,请使用IIS,imho。

b)您可以根据需要在同一个服务主机中运行尽可能多的WCF服务,但如果一个服务主机出现故障,则整个EXE崩溃。这就是为什么我建议IIS应用程序池,它在失败时自动重启,并且可以配置为在不同的应用程序池中运行每个服务。

c)根据应用程序的结构,有不同的策略来放置服务集成代码。我建议写一个" Service"每个WCF服务的类,并使用您的容器注册每个服务,因此您可以在需要任何特定服务的视图模型上使用ImportingConstructor。您将在引导加载程序中初始化并注册这些类。此时您可能会问自己是否确实需要6并且可能应该考虑合并为1个WCF服务。

d)我在这里不同意塞巴斯蒂安。如果您的服务很简单,WCF配置很简单。您需要它越复杂,配置就越复杂。默认情况下,您只需要很少的配置,我会查看Visual Studio附带的WCF服务配置编辑器工具来修改您的app.config和web.config,但不要混淆您正在处理的是哪一个!配置客户端的最简单方法是使用"添加Web引用"并指向服务器计算机上的URL。请记住,WCF允许您为同一服务配置多个端点(端点是具有端口和服务名称的URL),并且每个端点可以具有许多不同协议之一(我使用basicHttpBinding,wsHttpBinding或netTcpBinding,具体取决于根据我的需要)。我建议从wsHttpBinding开始,这是最容易调试的之一。手动修改app.config或web.config会让你遇到麻烦,因为一个错误的类型,你需要几个小时的调试。坚持编辑。

e)你不会在Prism和WCF上找到一个很好的参考,因为一个不会影响另一个的实现。通过将容器中的WCF服务代码封装在Prism中提供的服务类中,可以消除Prism本身与服务之间的任何依赖关系,并且不会因为无意中将它们耦合在一起而导致自己头疼。稍后,您可以使用Moq服务类注入视图模型,该服务类不会调用实际服务以进行测试。 Prism有一个非常好的CHM文件,你需要知道关于Prism的所有内容,WCF在微软的网站上有很好的文档(不需要书,除非你想得到花哨,比如Windows服务)。

随意跟进。

跟进#1:

当我使用IIS来托管我的服务时,我没有经验来指导您为多种服务实施ServiceHost。但是,IIS允许将多个服务放入同一个应用程序池(基本上是在您的计算机上运行的W3WP.exe的单个实例),所以我很确定它可以完成。

编辑:在阅读了您提供的WPF WCF指南后,我可以看到您在EXE中为要托管的每个服务创建了一个ServiceHost实例。因此,您需要6个ServiceHost实例,并在EXE代码中单独管理它们。

保理您的服务是一个设计问题。您选择为每个域类提供一个服务。如果我在我的应用程序中这样做,那么将有超过100项服务。相反,我选择了一个实现一个命令模式,它允许我对我想要的对象发出请求,无论其类型如何,并且它在一个干净的界面中将它们返回给我。

我相信你不会在任何一本书中找到关于在Prism和WCF之间完成你的设计的指导。您可以在博客中找到一些,但是,这是我的建议:

将WCF服务创建和操作封装在类(例如DataAccessService)中,可以通过依赖注入将其注入到视图模型中(请参阅ImportingConstructor属性)。如果发生错误(或其他可通知的事件),请使用eventaggregator服务从DataAccessService发布事件,并在视图模型中处理它们。不要通过直接在它们之间调用来创建视图模型或视图与WCF服务之间的内聚,因为这会违反两个SRP,并且无法在不触及Web服务的情况下测试视图模型(外部依赖项)

答案 1 :(得分:0)

a)对于“if”:确定,为什么不呢?对于“如何”:编写将服务部署到IIS或Windows服务或控制台主机的不同模块,并让用户选择要运行的模块。

b)每个主机可以使用一个服务,但可以使用多个具有不同绑定的端点。

c)进程是否意味着它们在您启动应用程序时启动?然后我会去找引导者。

d)通过app.config配置WCF并不简单。 Visual Studio中的工具很小,旋钮和刻度盘的数量很多。使用代码进行配置至少可以为您提供Intellisense支持。

e)我不认为这是一个非常常见的组合,所以我不打赌那里有任何文献。但是对于有关WCF的任何问题,我建议您阅读Juval Lowy的Programming WCF Services。我认为代码示例还包含WinFormsHost for WCF服务,这可能是“我在哪里托管服务”问题的另一种选择。