2

私は現在、複数の異なるクライアント アプリケーションで使用される 1 つのサービス コントラクト インターフェイス (以降「SCI」) で構成される大規模な WCF サービスをリファクタリングしています。クライアント アプリケーションの種類ごとに、必要な操作に固有の SCI が存在するように、SCI を分割しました。SCI の一部の共有セクションは、クライアント アプリケーション固有の SCI が継承する基本 SCI で定義されます。

すべてのクライアント固有の SCI を実装する単一のサービス クラスがあります。共有ベース SCI からのダイアモンド インターフェイス継承状況があるという事実は、場合によっては、同じ操作が複数の SCI を介して利用可能であることを意味します。クライアントを自動生成する場合 (特に非同期クライアント メソッドを使用する場合)、結果のコードには多くの醜いものがあり<generated-type>1,2,3ます...

これを回避するために、特定のアプリケーションに関連する SCI のクライアントのみを生成するサービス参照を各クライアント アプリケーションに追加したいと考えています。同じ機能が異なる SCI に表示されるため、問題は発生しません。

これは可能ですか?

この状況でモジュール性とコードの再利用の両方を達成するための他のヒントもいただければ幸いです。

4

2 に答える 2

1

やりたいことは、サービス コントラクト インターフェイスを作成することです (これを手動で行うか、元のサービス実装からプルするか、自動生成してコピーすることができます)。

次に、サービス参照を使用する代わりに、チャネル ファクトリを使用してサービスにバインドします (以下のように)。これは、WCF サービスを参照するための優れた方法です。

これを行うには、次の参照が必要です。

using System.ServiceModel;
using System.ServiceModel.Description;

次に、以下を使用できます。

     var binding = new WebHttpBinding();
     var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port"));
     factory.Endpoint.Behaviors.Add(new WebHttpBehavior());

     var myService = factory.CreateChannel();

     myService.ServiceMethod();
于 2011-12-13T23:47:52.683 に答える
0

試してみる価値のあるルークの提案。「ChannelFactory」の方法には、自動生成の方法よりも多くの利点があります。SCi のコメントを保持でき、SCI の変更後に参照を更新する必要がありません。

本番環境では、パフォーマンスのためにシングルトン キャッシュを実行し、サービスの実装には個別の SCI を実行して、クライアントとサービスの実装の両方で SCI を参照できるようにする必要がある場合があります。

「非同期」について言及しましたが、これはバインディングまたは動作構成の問題である可能性があると思います。

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress)
{
    ChannelFactory factory = null;
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress));
    factory.Open();
    return factory;
}
于 2011-12-14T00:48:01.730 に答える