我首先说Prism和WCF是相互排斥的框架,并且使用一个并不排除以任何方式使用另一个框架。
a)你为什么要让他们决定如何托管他们的WCF服务?最简单的配置是IIS托管,这需要最少的设置。一个IIS网络可以托管你所有的六个服务,除非你需要将每个服务放在一个单独的应用程序池中,从而避免了内存障碍。在服务主机中运行服务等同于编写EXE(例如Windows服务)来为客户端服务。更多的工作和配置(从Windows服务端来看,WCF配置是相同的,除非它通过在HTTP:80上运行与IIS冲突)。你有很多选择,但你使用WCF,所以我假设你有一个客户端/服务器场景。如果您有Windows服务器,请使用IIS,imho。
b)您可以根据需要在同一个服务主机内运行尽可能多的WCF服务,但如果出现故障,整个EXE将崩溃。这就是为什么我建议IIS应用程序池,它会在失败时自动重新启动,并且可以配置为在不同的应用程序池中运行每个服务。
c)根据应用程序结构的不同,有哪些策略可以放置服务集成代码。我建议为每个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服务(外部依赖性)的情况下测试视图模型的能力。
WCF和WPF/Prism是互不影响的互斥框架。此外,您有两个完全不同的产品 - 通过WCF部署服务的全部目的是将它们与消费应用程序分开,因此它们托管在Web服务器上供所有桌面应用程序通信。总之,你的问题没有意义。 – 2012-02-23 23:01:22