2011-09-04 109 views
3

WCF初學者的問題:有人告訴我,更改WCF合同代價高昂,需要不斷維護(在客戶端重新創建代理),因此首選方法有一個非常通用的方法聯繫點方法(根據給定的枚舉參數決定如何行動)。WCF單點聯繫人

這聽起來很臭,但我一直沒能找到關於這個問題的任何信息(可能是對搜索關鍵字的選擇不當)。 任何建議,或者可能是一個有用的鏈接?

謝謝!

回答

3

您不需要再次生成代理,只需確保客戶端使用正確的接口版本即可構建。如果你非常小心,只添加方法,而不是刪除或修改,那也可以。當然,這是一個很重要的管理責任。

要使用的界面,而不是生成客戶端代理,由前一段時間檢查我的問題:

WCF Service Reference generates its own contract interface, won't reuse mine

+0

+1:擴展合同不會破壞向後兼容性。如果客戶沒有使用合同中的任何新方法,則無需重新生成代理。 –

0

這是真實的,修改服務合同(接口)也將要求客戶重新代理類最後使用新發布的WSDL,甚至可能要求客戶將其代碼更改爲新代理的代碼。我不認爲你可以創建這樣一個通用界面,可以在合同中進一步處理所有更改。必須非常仔細地寫一份合同,以便它不會經常更改,如果需要更改合同,則最好使用不同的版本部署服務,以便舊客戶仍可以使用舊版本。

1

這取決於你的意思是什麼樣的改變。改變服務合同確實代價高昂,不應該發生。服務合同是(或應該)處於足夠高的粒度水平,這種變化非常罕見。

更常見的是對服務中暴露的類型的更改。這些更改更爲常見,因此您需要以避免破壞現有客戶端的方式來處理您的更改。

有幾種方法可以做到這一點,例如使用接口多態地展示您的類型,但最簡單的方法是簡單地確保您的類型的更改添加新的數據成員字段並使新字段非強制。如果您可以限制對這些更改的更改,那麼這對現有客戶端的影響最小,並且可以使新客戶端使用新字段。

希望這會有所幫助。

3

您在這裏混淆了一些術語,我想您可能指的是已經在.Net 3.5 SP1中修復的已知缺陷。

重新創建WCF代理曾經是一個昂貴的操作在運行時。這在.Net 3.5中得到了改進,可以透明地緩存代理對象MSDN Blog

如果您指的是代理的「代碼維護」,那麼您所指的就是在客戶端實現一個接口。如果您需要維護接口,那麼這將回到基本的SOA。如果您的服務提供了儘可能多的訪問權限和信息,假設您的服務將用於您尚未考慮的目的,那麼您可能無需在創建該接口後對其進行修改。你也應該考慮你的升級路徑。

Juval Lowy在他的書中有一個很好的關於這個問題的討論,它有點密集但有一些很好的信息。

一條建議:WCF有很多功能可以讓你的代碼變得簡單而優雅。如果您worreid有關維護,你可能被驅動做的是寫一個接口:

string ServiceMethod(string xml) //returns XML 

不要這樣做。花時間設計一個良好的可維護界面和良好的數據/消息合同。這將讓WCF提供您在託管服務進行交互時免費獲得的所有額外功能。

+1

+1爲「不要這樣做」... –

2

通用(如在非特定的,單片)接口很難理解和編程。不將API定義爲API的原因是客戶不可能理解正在發生的事情,並且當您更改此接口的(隱式)API時,您的客戶端將以可怕的方式破解,而您無法在編譯時間。我曾經觸摸過WCF已經有一段時間了,但是如果你的客戶端是內部的(相同的代碼庫,版本控制和部署方案),那麼重新生成WCF代理非常容易,並且擁有一個「強大的」詳細API將使你的生活比普通的要容易得多。