2012-02-14 94 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

相關問題