2014-04-29 49 views
0

我有一個關於服務器上方法擴展後果的問題,我很感謝您是否幫助我。服務器方法中的額外參數

我們假設如下。 我有一個方法在服務器上的門面:

public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{ 
    someDataLocator.SaveData(someDataEntities); 
} 

而從客戶喜歡叫它:

public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{ 
    this.Invoke("SaveSomeData", new object[] { someDataEntities }); 
} 

現在,我需要把它擴大到

public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode) 
{ 
    someDataLocator.SaveData(someDataEntities, mode); 
} 

我需要提供向後兼容性。因此,如果用戶使用舊版本,並且他嘗試僅使用一個參數調用此方法,會發生什麼情況? 服務器會猜測這是同一個方法並調用它嗎?如果是,將「模式」字符串(第二個參數)爲空或空?或者它只會拋出一個異常,說客戶端試圖調用一個不存在的函數。是否有可能解決這個問題,而不用重複一個和兩個參數的方法。

回答

1

我已經通過實驗找到答案。

它理解這是必要的方法並調用它。 當我具有門面單個參數然後調用該方法從舊的客戶端

public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode) 
{ 
    someDataLocator.SaveData(someDataEntities, mode); 
} 

執行與mode等於null在服務器上。

所以,我可以在「someDataLocator」中輕鬆處理它。向後兼容性本身提供。

2

你可以簡單地標記舊簽名爲廢棄,然後調用新的簽名用繩子空

[Obsolete] 
public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{ 
    someDataLocator.SaveData(someDataEntities, string.Empty); 
} 
2

WCF不支持方法重載,因爲WSDL不允許有兩個方法有相同的名字。您可以通過爲重載方法上的名稱屬性提供OperationContract來實現它。

[OperationContract(Name="SaveSomeDataDefault")] 
public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{ 
    this.Invoke("SaveSomeData", new object[] { someDataEntities }); 
} 

[OperationContract(Name="SaveSomeDataWithMode")] 
public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode) 
{ 
    someDataLocator.SaveData(someDataEntities, mode); 
} 

但是,這也並不是一個很好的做法,因爲它會導致你的問題進行調試跟蹤等做法是保持獨立的方法,而使用重載的WCF。

相關問題