2009-05-28 150 views
1

設置WCF服務項目和應用程序的最常見/最好的方法是什麼?WCF項目設置和依賴關係

下面是一個例子:

  • 解決方案: 「MyProject的」
  • 類庫: 「MyProject.Common」
    • 包含的ServiceContract接口,任何DataContracts
  • 類庫:「MyProject.Impl」
    • 包含執行服務合同的,以及可以用來調用服務
  • WCF服務的Web應用程序客戶端類:「MyProject.Service」
    • 包含引用MyProject.Common並實現了一套,因此,它可以承載服務
    • WCF服務的應用程序將配置端點在web.config
  • ASP.NET Web應用程序: 「MyProject.Web」
    • 包含引用到「MyProject.Common」和「MyProject.Impl」,以便它可以使用客戶端類
    • 的Web應用程序也需要配置在web.config端點等

我的問題是將合同和實現拆分爲單獨的DLL是否有意義,以及應用程序是否應該引用Common/Impl庫,或者應用程序是否應該只提供服務引用(使用「創建服務參考」或SvcUtil)。我認爲這些應用可能只是提供服務引用是有意義的,所以你不會將Common/Impl耦合到應用。在這種情況下,在MyService.Impl中創建客戶端類是否有意義?

回答

5

退房Web Service Software Factory。對於構建WCF應用程序有很多很好的指導,包括關於solution structure的一些指導。另外,IDesign.NET(Juval Lowy)也有一些guidance on that(zip鏈接)。

+0

+1感謝您的鏈接,我會檢查那些出 – 2009-05-28 04:54:04

+0

在未來的兩年裏,我感謝你呢! – DanTheMan 2011-04-19 20:28:14

1

如果您使用的是複雜類型,則應該在客戶端應用程序中包含服務接口和公共類,否則生成的代理將複製您在服務中使用的類型的定義,並且可能會導致您稍後序列化...

然後,您可以手動生成使用常用程序集中的類型的代理,並且不會重新創建模擬類型的其他類。

C:\樣品\ WcfSerialization> svcutil.exe的/out:WcfServiceProxy.cs/d:Schmu rgon.WcfClient.Web /r:Schmurgon.Data.Contracts\Schmurgon.Data.Contracts\bin\debu 克\ Schmurgon.Data.Contracts.dll http://localhost:5150/Schmurgon.WcfService.Host/S ervice.svc?WSDL

開關是:

/出:參數是簡單地輸出代理類的名稱。

/d:存儲代理類的目錄。

/R:含有否則將包含在代理類類型的組件

[無] WCF服務的地址。

(這是從http://schmurgon.net/blogs/ben/archive/2006/12/17/wcf-proxy-generation-without-types.aspx粘貼)

1

這取決於。

正常情況下,生成的代理類足以讓客戶端程序調用WCF服務,因此不需要客戶端庫。當然,在某些情況下,例如,如果您的合同只將Message指定爲其參數,並且您使用數據合同,但這些數據非常少見!

我不會做的是把客戶端類,如果你覺得你需要一個,在你的服務實現相同的庫中 - 客戶端不需要知道如何實現服務,只需要調用服務。通過將兩者結合在一起,你也可以分發你的服務實現。

如果您使用數據合同標記您使用的類,則無論如何您都應該這樣做,以便輕鬆對服務進行版本控制,否則Hugo暗指的複雜類型問題不會發生。

1

我的問題是將合同和實現拆分爲單獨的DLL是否合理,以及應用程序是否應該引用Common/Impl庫,或者應用程序是否應該只是創建服務引用(使用「創建服務參考」或SvcUtil)。我認爲這些應用可能只是提供服務引用是有意義的,所以你不會將Common/Impl耦合到應用。在這種情況下,在MyService.Impl中創建客戶端類是否有意義?

賓果 - 你「得到了」它!即使理論上,技術上可以共享使用共享程序集的合同和接口,我寧願建議不要。

首先,其他客戶端(例如Java,PHP,Ruby)將無法使用共享.NET程序集。因此,他們突然使用與客戶端不同的界面,這可能導致難以調試的細微變化。其次,SOA是關於將系統的各個部分分離爲具有明確定義的服務邊界的獨立的不同實體。共享程序集引入了您試圖避免的依賴關係。

因此,我會同意你在正確的軌道上 - 是否將合同界面與具體實施分離可以辯論。如果您需要創建相同接口的第二個,第三個實現,或者您的各種服務使用了獨立程序集中的某些常用幫助程序接口,則可能有一個好處。還有一個集會並沒有真正受到傷害 - 我的建議是完全按照您在文章中列出的方式進行!

馬克