2

C# の既存のコードに機能を追加して、MyAPI(arg1,arg2) などの API を呼び出そうとしています。クライアント側の API 定義のセットを持つ IProvider としましょう。API 用のラッパー実装を持つ Provider と ProviderNew の 2 つのクライアント プロキシ クラスがあります。これらの各ラッパー関数 (API 用) 内で、最終的にリモート サーバーでホストされているサービス API を呼び出します。ProviderNew(Not Provider) Project クラスの下のみ - サービス参照の下 - WSDL、xsd ファイルで MyAPI が定義されている (または、これらのファイルがどのように作成されているかわからないため、自動生成されている) ことがわかります。これらに加えて、MyAPI のいくつかの定義を含む ProviderNew のみのいくつかの references.cs ファイルが表示されます。これらのことは、ProviderNew のみが MyAPI のクライアント側プロキシ コードを実装していることを明確に示しています。

私の問題は、IProvider が MyAPI signature をインターフェースするため、両方の実装クラス (Provider と ProviderNew) が MyAPI のクライアント コードを実装することをシステムが期待しているということです。Provider.cs だけで MyAPI クライアント コードを実装しようとすると、次のようなエラーが表示されます。

Provider.ProviderServiceReference.ProviderServiceClient には 'MyAPI' の定義が含まれておらず、タイプ 'Provider.ProviderServiceReference.ProviderServiceClient' の最初の引数を受け入れる拡張メソッド 'MyAPI' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) MyPath..\Provider.cs

しかし、Provider.cs でそれらを実装せずに終了すると、エラーが表示されます (これは、インターフェイスを実装するすべてのクラス (複数の実装がある場合) が、サブセットではなく、すべての関数を個別に実装する必要があるという典型的なケースです)。関数の。)

'Provider' はインターフェイス メンバー 'IProvider.MyAPI(int , int)' MyPath ...Provider.cs を実装していません

これをできるだけ明確にするために最善を尽くしました。より明確にするためにお知らせください。

続行するにはどうすればよいですか? 助言がありますか ?

4

1 に答える 1

1

実装クラスは、インターフェイスのどの部分を実装するかを選択することはできません。すべてかゼロかです。WCF の観点から見ると、あるクライアントに操作 (メソッド) を追加したいが別のクライアントには追加したくない場合は、1 つではなく 2 つのサービスを見ていることになります。

たとえば、次の契約があるとします。

[ServiceContract]
public interface IProvider
{

    [OperationContract]
    int MyApiCall_1(string param);

    [OperationContract]
    string MyApiCall_2(int number);
}

Provider によって (最初に) 実装されます。すべてのクライアントがこのサービスを問題なく使用しています。

ここで、クライアントの 1 つが MyApiCall_3 にアクセスする必要があるが、残りのクライアントは必要ないとします。お気づきのように、これは MyApiCall_3 を必要としないすべてのクライアントにとって重大な変更になります。

単純にサービスを更新することもできますが、その場合、すべてのクライアントが MyApiCall_3 にアクセスできるようになり、何らかの理由でそれを望まない可能性があります。

別のオプションは、次のように、元のコントラクトから派生する別のコントラクト (インターフェイス) を作成することです。

[ServiceContract]
public interface INewProvider : IProvider
{

    [OperationContract]
    double MyApiCall_3();
}

次に、コントラクトを新しいサービスに実装します (簡単にするために、 と呼びましょうNewProvider)。追加の API 呼び出しが必要なNewProviderクライアントは を使用し、他のクライアントは古い を使用しますProvider

つまり、コントラクトに機能を追加する場合は、次のいずれかを実行できます。

1. 元の契約でその追加機能を利用できるようにすると、すべてのクライアントがそれにアクセスできるようになります。または
2. 元のコントラクトを継承する新しいコントラクトを作成し、それを新しいサービスを介して公開すると、追加機能を必要とするクライアントのみが新しいサービスを使用します。
于 2013-08-17T19:07:28.927 に答える