在Singleton上实现IDisposable是否正确

时间:2012-10-21 18:19:43

标签: c# wcf design-patterns

在我们的WCF项目中,我们使用singleton pattern来获取客户端代理。

基本上是因为 -

  1. 稍后需要在客户端对象添加上进行的任何增强 BindingEndpoint只需要很少的更改。
  2. 我们不会同时调用多项服务。
  3. 为了确保在每次服务电话后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();
        }
    }
    

    这是否违反了Singleton Design-Pattern原则?任何改进这方面的建议都会有所帮助。

    修改

    考虑using block处理客户端对象,如下所示 -

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

    这意味着WCF代理实现了IDisposable接口。所以我认为在这里实现这个界面没有任何害处。

    谢谢!

1 个答案:

答案 0 :(得分: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();
}