2012-05-14 21 views
3

我有一些在整個系統上使用的現有接口。在現有接口上應用ServiceContract和OperationContract

現在我想用其中一個接口作爲服務合同。

但問題是我需要在現有接口上添加[ServiceContract][OperationContract]屬性,並且它們會污染其餘的代碼。

解決這個問題的任何解決方案都無法複製接口?

在具體實現上應用屬性?這是一個很好的做法嗎?

謝謝

回答

7

你可以簡單地擴展了服務warpper類型接口的接口,即:

public interface IMyCode 
{ 
    string GetResult(); 
} 

[ServiceContract] 
public interface IMyCodeService : IMyCode 
{ 
    [OperationContract] 
    string GetResult(); 
} 

C#允許接口繼承,編譯器會吐出一個警告,IMyCodeService.GetResult需要新的,因爲它隱藏了IMyCode.GetResult方法,但不追加new不會打破的執行情況,作爲一個例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyCodeService service = new MyCodeService(); 
     IMyCodeService serviceContract = (IMyCodeService)service; 
     IMyCode codeContract = (IMyCode)service; 

     service.GetResult(); 
     serviceContract.GetResult(); 
     codeContract.GetResult(); 

     Console.ReadKey(); 
    } 
} 

public interface IMyCode 
{ 
    void GetResult(); 
} 

public interface IMyCodeService : IMyCode 
{ 
    void GetResult(); 
} 

public class MyCodeService : IMyCodeService 
{ 
    public void GetResult() 
    { 
     Console.Write("I am here"); 
    } 
} 

這樣的話,你可以提供基於現有的接口不改變服務合同您現有的代碼。

如果您分享您的合約程序集,而不是使用WCF爲您生成代理,那麼甚至可以在您接受現有接口的地方傳遞服務合約,因爲服務接口將繼承它。

+0

不應該爲每個'[OperationContract]'的繼承接口添加一個'new'關鍵字? –

0

我們正在慢慢地嘗試移動到WCF並得到同樣的問題。除了裝飾具有屬性的服務接口外,我們無法找到另一種方式。他們是屬性,所以希望不應該污染代碼太多。

一兩件事我們必須做的(運動形式遺留的Web服務時,是要確保所有相關性轉移到共同的地方,使他們能夠從雙方和Global.aspx WCF主機服務調用)

你必須在具體實現(主要是ServiceBehavior相關屬性)上實現屬性,以便WCF主機可以託管它。至於OperationContract,我們主要應用於接口。

相關問題