2013-04-01 63 views
0

我有一個像服務器一樣的軟件。客戶端通過暴露的接口與該軟件進行通信。我們公司希望爲我們的軟件引入新功能。使軟件根據版本選擇更改其行爲

版本1: 客戶< --->接口X1,Y1,Z1 < ---->服務器

版本2:

客戶< --->接口X2,Y2,Z2 ---->服務器

客戶希望能夠隨時切換到舊版本。當然,如果他們想切換到不同的服務器版本,他們會將其界面更改爲舊版本。我們公司希望我們有一個下拉選擇不同的版本。選擇最新版本應該公開新功能。選擇以前的版本應該隱藏新的功能。現在,問題是新功能還修改了現有功能的行爲!一些暴露的界面已經改變。這包括現有的方法簽名更改,某些方法刪除和一些新的方法添加。但是,現有方法中的主要代碼更改沒有完成。客戶端軟件將進行更改以適應服務器更改,無論何時切換版本。由於代碼庫相當大,我們的服務器代碼維護是主要關注的問題。因此,我們公司既不希望我們添加if/else條件檢查來實現此目標,也不會重複編碼。該軟件使用.NET 3.5 & WCF以C#編寫。客戶端使用SOAP與此軟件進行通信。

請建議我實現此目標的最佳方法。任何文件/設計/代碼我可以參考也讚賞。在此先感謝

回答

2

Here是wcf服務指南的一個很好的起點。 WCF開發人員在開發過程中牢記版本控制,因此大多數問題在wcf文檔中都是已知和描述的

如果您的契約是可變的,並且您無法做到這一點,那麼您可以保留舊的接口並實施新的

假設你在你的第二個版本有合同

interface IContractV1 
{ 
    void M(); 
    void N(); 
} 

現在,要刪除一個方法,並添加另一個

interface IContractV2 
{ 
    void M(); 
    void P(); 
} 

您的服務可以保持雙方的合同了,用不同的URI

youraddress/service/v1 
youraddress/service/v2 

現在舊的客戶端可以連接到舊的服務和新的一個新的服務

請注意,您可以重新使用datacontracts,如指引中所述,但您再也無法從中刪除任何財產

+0

感謝ArsenMkrt的指導。爲了深入研究更多細節,合同 - 接口由第三方提供。這是所有公司都應遵循的標準。所以我們無法控制接口。我們需要實施和支持他們。有沒有什麼辦法可以符合這兩個版本的接口而沒有太多的改變? – Alerter

+0

保持兩份合同的問題是什麼?你可以在這種情況下擁有兩個接口併爲這兩種情況保留實現,它不一定會重複代碼,你可以在一個服務中實現它或者有一些幫助類 –

+0

謝謝你理解我的問題。你能多提一些嗎?由於我沒有做太多的設計工作,如果你能舉一些例子或指向一個我可以檢查的地方,我會非常感激。 – Alerter