1

WCFプロジェクトでは、singleton patternクライアントプロキシを取得するために使用しています。

基本的に-

  1. クライアントオブジェクトの追加 BindingまたはEndpointで後で必要となる拡張機能は、最小限の変更で済みます。
  2. 同時に複数のサービスを呼び出すことはありません。

connection is closed各サービスコール後に正しく確認するためIDisposableに、以下のようにシングルトンで実装することを計画しています-

public class ClientSingleton : IDisposable
{
    static Service1Client client;
    private ClientSingleton()
    {
        client = new Service1Client();
    }
    public Service1Client getInstance()
    {
        if (client != null)
            return client;
        else
        {
            client = new Service1Client();
            return client;
        }
    }
    public void Dispose()
    {
        client.Close();
    }
}

これはシングルトンDesign-Patternの原則に違反しますか?これを改善するためのアドバイスがあれば役に立ちます。

編集:

using block以下のようにクライアントオブジェクトを破棄することを検討してください-

using (Service1Client client = new Service1Client())
{
    client.Operation1();
}

これは、WCFプロキシがIDisposableインターフェイスを実装することを意味します。したがって、このインターフェイスをここに実装しても害はありません。

ありがとう!

4

1 に答える 1

1

私は自分のプロジェクトで、サービス接続を適切に閉じる処理を行う拡張メソッドを使用しています。(私はいくつかのブログから拡張メソッドを盗みました、そして私はそのブログリンクを忘れました)

public static void CloseConnection(this ICommunicationObject client)
{
  if (client.State != CommunicationState.Opened)
  {
    return;
  }

  try
  {
    client.Close();
  }
  catch (CommunicationException)
  {
    client.Abort();
    throw;
  }
  catch (TimeoutException)
  {
    client.Abort();
    throw;
  }
  catch (Exception)
  {
    client.Abort();
    throw;
  }
}

(特定のプロキシに固有の)アプローチとは異なり、これを任意のプロキシで使用して、接続を安全に閉じることができます。

使用例

Service1Client client = null

try
{
  client = new Service1Client();
}
finally
{
  if(client != null)
     client.CloseConnection();
}
于 2012-10-22T14:45:12.217 に答える