2010-09-22 152 views
1

最近我在一篇文章中讀到,在WCF中設計OperationContracts時,方法1跟隨比方法2更受歡迎/優勢。WCF中的請求和響應範式

方法1

[OperationContract()] 
ResponseMessageType SomeOperation1 (RequestMessageType reqMessage); 

方法2

[OperationContract()] 
string SomeOperation2 (string parm1, string parm2); 

我可以理解,在參數/類型的任何參數列表中的任何改變未來,返回類型將剛做完在消息合約(RequestMessageType和ResponseMessageType)中。

但我不知道它是如何成爲一個優勢?

如果有任何更改的目的,必須完成的地方;如果我們在「操作合同」或「消息合同」中執行操作,會有什麼區別。

我想了解並認識到第一種方法的優點。

回答

4

我認爲在數據合同中做這件事的好處是,修改現有的數據合同而不破壞與舊客戶端的兼容性會更容易。

假設您想要將其他信息返回給調用者。使用簡單的數據合同,只需添加一個額外的字段。老客戶會忽略它。如果您希望新客戶能夠與舊服務器交談,只需將該字段設置爲可選。

我不知道如何在服務合同中做到這一點,而不需要引入新的服務合同或至少一個新的運營合同。實現不會更困難,但會更加混亂界面。因此,您擁有「靈活」的數據合同(可能有許多可選字段)與冗餘操作混雜在一起的服務合同。

這是一個妥協,但我贊成在大多數情況下「靈活」的數據合同。

如果您同時控制客戶端和服務器,並且可以輕鬆確保每個客戶端都是最新的,則會出現異常。在這種情況下,只需修改(並理想地重命名)您喜歡的任何合同,並放棄對舊合同的支持。

順便說一句:其他方向非常相似。您還可以在客戶端發送到服務器的數據合同中包含其他(可選)字段。也許新客戶想要添加一些可以加速處理的提示。或者添加不需要完成某些操作的附加數據,但服務器可以將其存儲在日誌中以幫助進行故障排除等等。

+0

我同意@pgroke,您將通過使用數據合同獲得更高的靈活性。但是,如果你不能控制客戶(即你的客戶不能重建)。那麼您還需要考慮數據合同版本控制。這些文章將指向您正確的方向:http://msdn.microsoft.com/en-us/library/ms731138.aspx和http://msdn.microsoft.com/en-us/library/ms733832.aspx – 2010-09-23 07:47:00