2012-05-14 3 views
3

私はシステム全体で使用されているいくつかの既存のインターフェイスを持っています。既存のインターフェイスでServiceContractとOperationContractを適用する

ここで、インターフェイスの1つをサービス契約として使用したいと考えています。

しかし、問題は既存のインターフェイスに[ServiceContract][OperationContract]の属性を追加する必要があり、残りのコードが汚染されることです。

インターフェイスを複製してこの問題を解決する方法はありますか?

具体的な実装に属性を適用していますか?それは良い練習ですか?

おかげ

答えて

7

あなたは、単にすなわち、サービス・warpperのタイプのインターフェースとインターフェースを拡張することができます:

public interface IMyCode 
{ 
    string GetResult(); 
} 

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

C#は、インターフェイスの継承を可能にし、コンパイラはそれがIMyCode.GetResultメソッドを隠すためIMyCodeService.GetResultが新しいが必要であると警告を吐き出すます

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"); 
    } 
} 

こうすることで、あなたが変更することなく、既存のインタフェースに基づいてサービス契約を提供することができますが、ないnewは実装を壊さないであろう、一例として追加既存のコード。

プロキシを生成するためにWCFを使用する代わりに契約アセンブリを共有する場合、サービスインタフェースはサービスインタフェースを継承するため、既存のインタフェースを受け入れる場所にサービスコントラクトを渡すこともできます。

+0

'[OperationContract]'に継承されたインタフェースに 'new'キーワードを追加するべきではありませんか? –

0

我々はゆっくりとWCFに移動しようとしていると同じ問題を抱えています。私たちは、属性を持つサービスインタフェースをデコレートすることとは別の方法を理解することができませんでした。これらの属性は、あまりにも多くのコードを汚染してはならないはずです。私たちがしなければならなかった

一つのこと(フォームレガシーWebサービスを移動するとき、彼らは両方Global.aspxとWCFホストサービスから呼び出すことができるように、すべての依存関係が共通の場所に移動されていることを確認することである)

あなたはWCFホストがホストできるように、具体的な実装(主にServiceBehavior関連の属性)に属性を実装する必要があります。 OperationContractについては、主にインターフェイスに適用されました。

関連する問題