WCFサービスからインターフェイスを返す
-
08-07-2019 - |
質問
いくつかの.NETリモーティングコードがあり、サーバー側のクラスに実装されているファクトリメソッドが具体的なオブジェクトへのインターフェイスを返し、同じサーバーで実行されています。 .NETリモーティングは自動的にプロキシを作成し、クライアントにインターフェイスを渡すことができます。クライアントはそれらを直接呼び出すことができます。
インターフェースの例:
public interface IFactory
{
IFoo GetFoo();
}
public interface IFoo
{
void DoSomething();
}
クライアントコードの例:
...
IFactory factory = (IFactory) System.Activator.GetObject (typeof (IFactory), url);
...
IFoo foo = factory.GetFoo (); // the server returns an interface; we get a proxy to it
foo.DoSomething ();
...
これはすべてうまくいきます。ただし、現在、コードをWCFに移行しようとしています。元の.NETリモーティングと同様に、インターフェイスをやり取りし、クライアント上でWCFがプロキシをオンザフライで生成する手段があるかどうか疑問に思います。
そして、実際のクラスを公開したくないので、クラスインスタンスを返したくありません。また、完全なインスタンスをシリアル化し、サーバーとクライアント間でやり取りすることもオプションではありません。クライアントがインターフェイスポインター/プロキシを介してサーバーオブジェクトと通信するようにしたいだけです。
アイデアはありますか
他のヒント
申し訳ありません、ジェゼル、わかりません。
はい、クライアントで ChannelFactory
を使用して IFactory
へのプロキシを作成できます。そのシングルトンオブジェクトは「公開」されているためです。 ServiceHost
のURIを介してサーバーによって。
ただし、サーバー上の IFoo
インスタンスは、 ServiceHost
に関連付けられていません。クライアントで IFactory
プロキシを呼び出してそれらを取得し、WCFにサーバー IFactory
を呼び出して、 IFoo
。クライアントにマーシャリングされ、動的に生成されたプロキシにラップされます。クライアントで factory.GetFoo();
を記述できるようにしたいだけです...
その間、ブライアンは、MSDNで見落としていた非常に興味深いドキュメントを教えてくれました。クライアント側のプロキシを取得するために、 ChannelFactory
を作成しました。
それで、.NETリモート処理コードを複製する方法はわかりましたが、比較的高いコストを払っています。 WCFに関連するコードの複雑さは、単純な古い.NETリモート処理ソリューションよりもかなり高くなります。
ChannelFactoryクラスはこれを正確に行い、実行時にインターフェイスを指定してプロキシを動的に生成します。