2012-12-31 82 views
4

假設我有生產pc運行的wcf服務。只是引導我需要添加代碼以便爲我的服務提供版本。如何維護同一wcf服務的多個版本

我是否需要單獨或不能保持版本的服務合同和合同數據....只要給我至少有兩個版本創建WCF服務的小例子。

如果少數幾個客戶正在消耗我的服務,如果我改變服務合同的任何現有方法,或添加一些更多的方法來服務合同,然後會發生什麼事....在那種情況下客戶可撥打我的服務或者他們需要再次創建代理以獲取服務合同中的更改。如果有人用小樣本代碼討論我的觀點以清楚地表達想法,這將非常有幫助。謝謝

回答

3

有幾件事情你需要考慮。首先,您需要將命名空間添加到您的合同和模式/消息中。爲什麼?那麼因爲如果版本1和版本2具有相似的操作和消息,它們可能會相互衝突。添加名稱空間會讓代碼/客戶端知道他正在處理2個不同的實現。

其次,你可能要問,爲什麼要改變一個服務合同。是否需要添加需求操作?或者它是一種全新的功能,可以分解爲新的WCF服務。如果您想維護版本,請將全新功能添加到新服務中,並且如果它必須是當前服務的一部分,請複製合同並創建單獨的版本。

更改服務合同將打破當前與該合同工作的客戶端。爲服務創建單獨版本將允許當前客戶端繼續使用先前的版本,直到更新該客戶端。所以你會得到這樣的東西。

namespace MyNamespace.Contracts.V1 
{ 
    [ServiceContract(Namespace = "urn:company:project:servicename:v1")] 
    public interface IService 
    { 
     [OperationContract] 
     void RequirementA(); 
    } 
} 
namespace MyNamespace.Contracts.V2 
{ 
    [ServiceContract(Namespace = "urn:company:project:servicename:v2")] 
    public interface IService 
    { 
     [OperationContract] 
     void RequirementA(); 

     [OperationContract] 
     void RequirementB(); 
    } 
} 

兩個版本都將單獨託管,並且您的實現也會有所不同。但是,您可以讓實現將您的操作委託給某種(業務)控制器,該控制器支持這兩個版本,並且您的流將看起來像這樣。

  • V1.IService - V1.Implementation將委託調用的MyServiceController
  • V2.IService - V2.Implementation也將委託調用的MyServiceController

通過這種方式,你可以有1個控制器處理任何需要執行的(業務)邏輯,防止任何可能的重複代碼。

+0

我只是不明白,最後兩行被稱爲 「 V1.IService - V1.Implementation - MyServiceController V2.IService - V2.Implementation - MyServiceController 」 它是什麼....請給我詳細的洞察力。謝謝 – Thomas

+0

需要一個更多的幫助我需要添加任何名稱空間數據合同維護任何版本相關的數據合同?如果給我很少的文章鏈接,可以用很多示例代碼更詳細地討論這個服務版本,那將會非常有幫助。感謝你的幫助。 – Thomas

+0

是的,建議在數據合同之間維護不同的版本。正如你所說的,你也可以爲它們添加命名空間。你會得到類似於'ServiceContract'命名空間的東西。我真的沒有任何文章給你。對不起:( –