Web サービスとインターフェイスの互換性
-
20-08-2019 - |
質問
Visual Studio で Web サービス (これはすべて WCF) にサービス参照を追加すると、公開されているインターフェイスのクライアント側の再記述を含む、いくつかの生成コードが生成されます。
このインターフェイスが生成される理由はわかりました。サードパーティのサービスを利用していて、実際のインターフェイスにアクセスできない可能性があります。
でも私はそうする、そして二人は ない たとえ透過プロキシが実際にキャスト先のインターフェイスを正確に実装していても、割り当て互換性があります。
反射を使用することもできますが、それは醜いです。この偽の型安全性を無効にして、クラスとのインターフェイスを使用できるようにメタデータを挿入する方法はありますか?
私の問題は、基本クラスの一部の派生クラスを直接使用し、他のクラスをサービス参照を介してリモートで使用する単一のクライアントに関係する複雑な方法で標準から逸脱しています。各サーバーの基本クラスは、イベントを通知するために列挙するためにサブスクライブしているクライアントへの参照をコレクション内に保持する必要がありますが、問題の種類はプロキシの使用により変化しました。
これらの回答はどれも私の問題を解決するものではありませんが、どの回答も有益で役に立ちました。私は独自の解決策 (デュアル バインディングを使用する) を見つけましたが、ビジネス全体に対する私の理解が根本的に改善されなかったら、決して解決できなかったでしょう。
素晴らしい回答が 3 つあります。1 つだけを選択するにはどうすればよいですか?最初のものを選択するのは、最初の問題を直接解決するためです。 考え 持っていました。
解決
、「詳細設定」に移動し、選択されていることを確認「参照アセンブリにおける再利用の種類」を作成し、あなたのインターフェイス定義を含むアセンブリが選択されていること。また、
。その上で右クリックし、「設定」に行くことによって、既存のサービスを参照してこれを行うことができます他のヒント
、あなたもサービス参照を必要としない - あなたは、単にサブクラスClientBaseをすることができますし、チャンネルを公開、および使用その直接 - のようなもの(無IDE便利な...):
public class WcfClient<T> : ClientBase<T> where T : class
{
public new T Channel {get {return base.Channel;}}
}
次に、あなただけのようなものを行うことができます
using(var client = new WcfClient<IFoo>())
{
client.Channel.Bar(); // defined by IFoo
}
あなたはまだなど、バインディング、アドレスを決定するためにconfigのコンフィギュレーション設定を必要とする - が、プロキシ世代未満乱雑。また、あなたは、WCFプロキシが(悪いです)IDipsoable
に投げることができるという事実に対処するDispose()
を再実装することを選択するかもしれません。
public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
public new T Channel {get {return base.Channel;}}
void IDisposable.Dispose() {
try {
switch(State) {
case CommunicationState.Open: Close(); break;
// etc
}
} catch {} // swallow it down (perhaps log it first)
}
}
サービスからインターフェイスを返すには、KnownType 属性を使用する必要があります。
-
サービスからカスタム タイプを返したい場合は、次のようにします。
それは役に立ちますか?