1

私は WCF クライアント/サービスを書いています。このサービスは長い操作を実行できるため、コールバック コントラクトを追加しましたIProgressCallback。私が開発しているシステムは、あらゆる種類の環境で実行する必要があるため、コールバック チャネルを開くことができない環境に遭遇するのではないかと考えています (ここで間違っている可能性があります)。

ですから、注意するために、このように操作コントラクトを定義しました。

[ServiceContract()]
interface IContract
{ ... }

[ServiceContract(CallbackContract = typeof(IProgress))]
interface IDuplexContract : IContract
{ ... }

これはサーバー側でうまく機能します。いずれかのコントラクトを使用するようにサービスを簡単に構成できます。

ただし、問題はクライアント側で発生します。2 つのプロキシを手動で定義しました

public class ContractProxy 
   : ClientBase<IContract>, IContract
{ ... }

public class DuplexContractProxy 
   : DuplexClientBase<IDuplexContract>, IDuplexContract 
{ ... }

ここでも、両方のプロキシが正常に動作します。

これで、正しいプロキシの作成を担当するプロキシ ファクトリができました。インスタンス化するプロキシを簡単に判断できますが、プロキシを返そうとすると問題が発生します。

ユーザーは少なくともオブジェクトを戻す必要がありますが、IContractICommunicationObjectを返すかを見つけることができませんでした。私は次のことを試みました:

IContract CreateProxy(...)  // The user lacks access to Open, Abort, Close, etc.
ClientBase<IContract> CreateProxy(...)  // DuplexClientBase derives from ClientBase but the generic parameter is different and it isn't covariant so this cannot be done.

// First define a generic interface and then make both proxies implement it.
IProxy<TContract> : TContract, ICommunicationObject  // TContract cannot be restricted to an interface so I cannot make IProxy derive from TContract

現在、回避策として IContract インターフェイスを返すだけですが、プロキシを使用しているすべてのユーザーは、プロキシなどを開くために ICommunicationObject にキャストすることから始める必要があります。

ここの誰かがこれを行うためのより良い方法を持っていますか、それとも環境によっては二重通信が機能しない可能性があることを過度に心配しているだけですか?

4

0 に答える 0