2010-06-04 32 views
0

我有一個WCF服務,它暴露了很多方法。Upcasting ServiceContract

我的應用程序使用此服務,包括的ServiceContract對於只有一些方法OperationContract的定義。

要剪切的問題,考慮下面的代碼示例:

[ServiceContract] 
public interface IServer 
{ 
    [OperationContract] 
    void BasicOperation(); 
} 

[ServiceContract] 
public interface IExtendedServer : IServer 
{ 
    [OperationContract] 
    void ExtendedOperation(); 
} 

我想訂立合同,使應用程序的擴展能力。換句話說,我希望能夠在任何地方使用IServer合同,但是允許插件式架構擴展基本合同接口,以便插件本身可以調用ExtendedOperation()運營合同。

那麼,如何構建我的代碼,或者,做什麼樣的變化我必須作出,以便能夠像做以下? (信道類型iServer中的)

((IExtendedServer)channel).ExtendedOperation() 

當我試圖做到這一點,我得到錯誤

System.InvalidCastException:無法投透明代理鍵入「Contract.IExtendedServer」。

我希望我沒有混淆...

回答

4

SOA世界中的服務需要有一個定義良好且相當靜態的接口。 SOAP服務需要在WSDL中進行表示(並且爲涉及的數據包含或分開XSD = XML模式)。

我看不出在服務世界中如何創建類似插件系統的東西。插件在本地應用程序上運行良好 - 加載資源,語言擴展,圖形過濾器 - 無論您的想象如何。但在SOA世界中,這種「敏捷性」與您正在嘗試做的事完全相反 - 創建並提供定義明確的完全指定的服務以供使用。

唯一的選擇,我可以看到的是使用基於REST的方法,因爲你真的沒有很多的限制。通常我會說這種缺乏正式的服務描述是REST的主要缺點之一,但是由於使用REST,這些操作實際上只是使用URL定義的,這對您的情況可能是一個優點。

所以,我要說:如果你真的想在服務的靈活性,您需要檢查基於REST的服務。 SOAP不適合該賬單。轉到MSDN上的WCF REST Developer Center,獲取有關如何在WCF中使用REST以及如何使用REST的大量信息和資源。

+0

+1提供具體的選擇與周到的推理。 – David 2010-06-04 19:08:33

+0

謝謝。在我自己的推理中,我有點模糊,有一些想法,但它似乎並不堅持,尤其是經過很好的解釋。 – 2010-06-04 21:37:39

0

我不知道你要在這裏完成的。你正在處理的服務有端點暴露特定的合約(即接口)。你不是在處理物體和鑄造等等。它不會起作用,反正也不是正確的做法。

我看到它的方式,你有什麼確實就是:公開一個端點與一組共同操作的,和潛在的與擴展業務的其他合同的額外的端點X號的服務。您仍然可以在服務端擁有單個服務類,但就客戶端而言,它們只是不同的端點/服務。

相關問題