2009-01-22 25 views
6

我的應用程序有2個「服務」,比方說一個是基本(整數)計算器,另一個是浮點計算器。我表示這些接口如下:WCF和接口繼承 - 這是一件可怕的事情嗎?

public interface IBasicCalculator 
{ 
    int Add(int a, int b); 
} 

public interface IFloatingPointCalculator 
{ 
    double Add(double a, double b); 
} 

我想通過WCF公開這些。不幸的是,WCF似乎與所有可能的操作都需要經過一個單一的服務接口 - 你不能在服務之間共享會話,這在客戶端很麻煩,因爲你需要創建一個單獨代理每個人,似乎沒有任何「子服務」等...

所以,我已經收集到,我需要提出一個「組合」接口(也可以稱之爲門面),像這樣:

[ServiceContract] 
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator 
{ 
    [OperationContract(Name = "AddInt")] 
    new int Add(int a, int b); 

    [OperationContract(Name = "AddDouble")] 
    new double Add(double a, double b); 
} 

如果我這樣做,那麼WCF暴露了這兩種方法的客戶端,可以打電話給他們,而這一切實際工作。

但是,「繼承接口」似乎是不明智的。 特別newint Addnewdouble Add。嚴格來說,一個方法上的new表示隱藏了一個基本的方法,而我根本沒有這樣做。我可以省略new,但後來我得到的編譯器警告相當於「我認爲我隱藏了這種方法,您需要重命名它的方法或在其上放置新的」。

所以,這是一個2部分的問題:

  1. 難道我的軌道上與我「一切都結合成一個接口」的邏輯,或者是有實際揭露「子服務」還是有辦法使用WCF的「多個鏈接服務」?

  2. 如果這是需要做的,有沒有更好的方法?

謝謝!

回答

4

我會說一般,不。請記住,您正在處理分佈式應用程序技術,而不是分佈式對象技術,因此像繼承這樣的概念不適用。

在一般情況下,我不會走這條路,而是有其表示你想通過端點暴露的操作的邏輯分組的具體合同。

8

我只是工作了,你可以暴露多個端點(每次使用不同的接口),以同樣的服務,而你仍然只需要生成客戶端這給他們所有人訪問,這解決了我的問題,在一個代理LIB完全。

3

我相信你所描述的並不是最好的做法。當然,在服務類型上實現多個服務契約是可行的,因爲它只是實現多個接口的問題。

WCF肯定支持使用唯一URI和獨立合同進行通信的多個端點的可行性。然而,該ClientBase類只接受一個合同接口類型的事實,例如,幾乎意味着代理類,即使它們被存儲在同一個lib中,還需要清楚地僅實現一個合同接口。

如果您實際上只創建一個代理類定義成功,我很想知道您是如何設法完成此操作的。儘管我可能會誤解你的需求。實施不同的代理類爲您提供最大的靈活性,因爲對於不同的合同,OperationContractAtrribute值(如IsInitiating和IsTerminating)可能會有所不同。結合兩個合同的接口(如您的示例),可能會改變您將服務合約上的方法歸類的方式。

+0

順便提一下,我使用標記接口作爲所有數據協定的基礎。這使我能夠一般地處理我的WCF框架內的數據合同。 – 2009-01-23 22:07:51