3

システム全体で使用される既存のインターフェースがいくつかあります。

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

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

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

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

ありがとう

4

2 に答える 2

7

サービスワーパータイプのインターフェイスを使用してインターフェイスを拡張するだけで、次のようになります。

public interface IMyCode
{
    string GetResult();
}

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

IMyCodeService.GetResultC#はインターフェースの継承を許可し、コンパイラーはメソッドを非表示にするためにnewを必要とする警告を吐き出しますが、例として、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を使用してプロキシを生成する代わりに、コントラクトアセンブリを共有する場合は、サービスインターフェイスが継承するため、既存のインターフェイスを受け入れる場所でサービスコントラクトを渡すこともできます。

于 2012-05-14T09:31:53.480 に答える
0

私たちはゆっくりと WCF に移行しようとしていますが、同じ問題が発生しました。Service インターフェースを属性で装飾する以外に、別の方法を見つけることができませんでした。それらは属性であるため、コードをそれほど汚染しないことを願っています。

私たちがしなければならなかったことの 1 つは (従来の Web サービスから移行する場合、Global.aspx と WCF Host Service の両方から呼び出せるように、すべての依存関係を共通の場所に移動することです)。

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

于 2012-05-14T09:17:49.673 に答える