我首先說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