2012-01-20 12 views
4

私は、複数のWCFサービス参照を持つWebアプリケーションを開発しています。現在、我々は(例として)次の操作を行い、サービスの呼び出しを行う必要があるたびに:静的クラスのオブジェクトインスタンス

Service.ServiceClient ServiceClient = new Service.ServiceClient(); 
ServiceClient.SomeMethod(); 

各サービスへの静的参照を含む静的クラスを持っているし、代わりにそのクラスを呼び出す方が良いでしょうこれにより、呼び出すたびにServiceClientオブジェクトの新しいインスタンスを作成しないようにします。例えば

public static class Services 
{ 
    private static Service.ServiceClient _ServiceClient = new Service.ServiceClient(); 
    public Service.ServiceClient ServiceClient 
    { 
     get 
     { 
      return _ServiceClient; 
     } 
    } 
} 

そして、このようにそれをやっている場合、新しい私たちは、そのオブジェクトを呼び出すようにしようとするたびに作成されるオブジェクト、または意志原因となるライン

private static Service.ServiceClient _ServiceClient = new Service.ServiceClient(); 

それが呼び出されるたびにそのオブジェクトの同じインスタンスになりますか?

+1

のようにそれを消費します、次のように今、これらの関数の中にあなたが行うことができ、任意のは、チャネルファクトリは、下に異なるインスタンスのthatsの間でリソースを共有する方法すべてのインスタンス間で共有リソースを解放するために完了したら、各インスタンスをClose()する必要があります。 –

+1

さらに、すべてのコールで同じプロキシオブジェクトを使用していて、何らかの理由でコールで失敗した場合、このオブジェクトは、Abort()およびロングストーリーを使用しない限り使用できません。その方法で使用するように設計されています。プロキシのインスタンスを作成し、メソッドを呼び出し、最後にインスタンスを閉じます()。 –

答えて

2

あなたのデータコントラクトによって公開されるすべての機能を持つことになりますクラスを持つことができます。これらのメソッドはすべて静的になります。

public class ServiceManager{ 
    public static CalculatedData SomeMethod() 
    { 
     var client = GetClient(); 
     try 
     { 
      return client.SomeMethod(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Error 
     } 
     finally 
     { 
      if(client.State == System.ServiceModel.CommunicationState.Opened) 
       client.Close(); 
     } 

    } 
    private static SomeClient GetClient() 
    { 
     return new ServiceClient(); 
    } 
} 

は、消費者がそれを各呼び出しで新しいインスタンスを作成します

var calculatedData = ServiceManager.SomeMethod(); 
0

あなたは次のようにヘルパーを使用することができます。

次の方法で呼び出すことができ
private delegate void ServiceAction(Service.ServiceClient client); 

private static void PerformServiceAction(ServiceAction serviceAction) 
{ 
    using (var client = new Service.ServiceClient()) 
    { 
    serviceAction(client); 
    } 
} 

:それはまだ通話のすべての呼び出しやシーケンスのが、でプロキシを作成し

Helper.PerformServiceAction(client => client.SomeMethod()); 

を少なくともあなたの呼び出しコードは軽いです。

(「wcfクライアントプロキシで「使用」を使用することはお勧めできません。disposeは例外をスローする可能性があるため、例外をキャッチして手動で正常に閉じることが望ましいためです)。

+0

確かに、例外が発生した場合、クライアントは中止する必要があります。 –

+0

@ArsenMkrtはい、usingを使用すると、元の例外を隠す例外がトリガされる可能性があります。 –

1

これは1度だけ作成されますが、いつ作成されるかは制御できません。これを処理する通常の方法は、インスタンスを作成する場所または最初に呼び出されたときにインスタンスを作成する場所の、別個の静的メソッド(initなど)を作成することです。これについては、singleton design patternを確認する必要があります。あなたがしたい場合は

+0

Mhmm私はこれを考えましたが、それほど素晴らしい解決策ではありません。また、私は静的な{}コンストラクタを使用することはあまり使用されるとは思わない:? –

2

ので、シングルトンサービスは、究極の共有可能なサービスです

Singleton Service

作成します。サービスがシングルトンとして構成されている場合、接続されているサービスのエンドポイントに関係なく、すべてのクライアントが独立して単一のよく知られたインスタンスに独立して接続されます。シングルトンサービスは永遠に存在し、一度ホストがシャットダウンすると処理されます。シングルトンは、ホストが作成されるときに1回だけ作成されます。

あなたはInstanceContextMode.SingleにInstanceContextModeプロパティを設定することによって、シングルトンサービスを設定します。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class MySingleton : ... 
{...} 
+0

これは、OPが達成しようとしているものではないと思います –