2016-06-01 13 views
1

WCFサービスを使用するデスクトップアプリケーションがあります。私は、非同期WCF呼び出しを実装すると、使い勝手が向上しています。WCFサービスクライアントの初期化戦略

私の質問は、サービスクライアントを初期化するベストプラクティスは何ですか?

資格を持つ単一の静的オブジェクトとパブリックメソッドGetClient()が存在し、これはすべての呼び出しの前にnew ServiceClientを作成していました。

using (var svc = ServiceClientFactory.GetClient()) { 
    var data = svc.CallMethod(...); 
    some_application_context.specific_attribute = data; 
} 

ので、任意の呼び出しの前に、作成された新しいクライアント、操作が終了したとのデータが使用された受信直後に破壊されました:アプリケーションでは、一般的にこのような構成を用いました。

私の質問です:すべての呼び出しの前にクライアントコンストラクタを呼び出すのがベストプラクティスですか?

私は、起動時に一度初期化され、アプリケーション終了時に一度破棄される単一の静的クライアントオブジェクトを作成しようとしましたが、想定されるパフォーマンスの向上はありません。

それはうまくいくようですが、単一のクライアントを使用する際の非常に明白な障害はありませんか?そして、何がお勧めですか?

答えて

0

それは広範な質問のようなものです。それは多くの要因やスタイルにも影響します。

一般的に信頼できるセッションやセッションを使用する場合は、もちろん参照を保存する必要があります。 サービスを何度も呼び出すときは、参照を格納するほうがよい場合もあれば、そうでない場合もあります。それ以降はより良いプロフィール。

私は常に参照を保存し、クライアントがnullかフォールト状態かどうかをチェックするプロパティを作成します。

Service.ServiceClient ShippingService 
{ 
    get 
    { 
     if (mService == null || mService.State == CommunicationState.Faulted) 
     { 
     mService = new Service.ServiceClient("netTcpService"); 
     mShippingService.Open(); 
     } 

     return mService; 
    } 
} 
+0

'mService.State' - それが障害物でした、私は求めていました – obratim

0

サービス参照を取得するには、依存関係注入を参照する必要があります。効果的であれば、現在と同じパフォーマンスではないにしても似ていますが、長期的な管理が容易になり、単体テストが容易になります。

ほとんどのWCFオーバーヘッドは接続ネゴシエーションなので、各コールでのシングルトンと新機能は実際に大きな違いにはなりません。