2012-02-14 74 views
0

我的应用程序目前由2种不同的解决方案组成。在Prism桌面应用程序中配置和托管WCF服务

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

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

我发现迄今为止最近的信息是从http://wcfguidanceforwpf.codeplex.com/releases/view/27987,但我不认为这是我所期待的。

我想知道: -

一)如何,如果你能允许用户不同的托管策略WCF服务的选择呢?
b)我看过的所有例子都显示了ServiceHost打开和启动一个服务。这是推荐的做法,我将不得不创建6个服务主机,或者我可以在一个ServiceHost中启动6个WCF服务吗?
C)如果WCF服务过程进行测试,例如在本地运行 - 你用在壳牌引导程序并打开所有6个WCF服务,或者是有一些其他的地方,出现这种情况?
d)您使用配置端点或者是简单修改的​​app.config文件的情况下,什么样的战略?
E)如果有网上什么像样的引用或书,我没有设法找到盖棱镜桌面/ WCF配置?

道歉的问题的数量,但通常我可以拼凑一个想法,我需要做广泛的谷歌搜索,但在这种情况下,除了上面的链接,我似乎无法找到任何东西,似乎与我需要知道的匹配。

任何帮助,这对任何问题将是非常赞赏。

亚历

+0

WCF和WPF/Prism是互不影响的互斥框架。此外,您有两个完全不同的产品 - 通过WCF部署服务的全部目的是将它们与消费应用程序分开,因此它们托管在Web服务器上供所有桌面应用程序通信。总之,你的问题没有意义。 – 2012-02-23 23:01:22

回答

0

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

b)每个主机一个服务但具有不同绑定的多个端点是可能的。

C)在过程意味着它们,当你启动应用程序启动?然后我会去找引导员。

d)关于通过app.config配置WCF没有什么简单的。 Visual Studio中的工具很少,旋钮和拨号的数量很多。使用代码进行配置至少为您提供了Intellisense支持。

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

2

我首先说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服务(外部依赖性)的情况下测试视图模型的能力。

+0

关于b)和c)我的问题出现了,因为我有一个产品的WCF服务,一个用于客户,一个用于订单,一个用于地址等。我看不出如何在1个WCF服务中实现这些服务。另外,我看不出如何在我能看到的所有示例ServiceHost代码中运行一个包含6个WCF服务的服务主机。对于e)我正在寻找一些关于如何使服务调用生产准备就绪的指导,并在使用MVVM时将错误从WCF服务返回给客户端。 – lostinwpf 2012-02-23 19:54:26

+0

@lostinwpf你完全困惑我的朋友 - 你的WPF应用程序架构(Prism,MVVM,无论)与你的服务如何工作无关......尝试构建一块一次......构建和部署你的WCF服务在Web服务器上,对它和Fiddler2运行单元测试。当满意时...打开你的WPF解决方案,并写下它的后端与WCF端点交谈......每个解决方案之间都有一条黑白线 – 2012-02-23 23:05:43

+0

@Bahru +1仅用于解释... – 2012-02-23 23:07:45

相关问题