使用Web服务代理在类中实现IDisposable

时间:2013-11-06 22:58:45

标签: c# .net web-services idisposable

一直困扰着我的.NET的一个领域正是实现IDisposable模式的时候。

我使用WSDL创建了一个SOAP Web服务代理,它在Component基类上实现了IDisposable:

public partial class WSDLGeneratedProxy : System.Web.Services.Protocols.SoapHttpClientProtocol

我已经使用简化的方法创建了sort-of facade接口,这样我就可以隐藏服务代理交互,并使其实现IDisposable:

public interface IServiceClient : IDisposable

我有一个IServiceClient的实现,该实现包含WSDLGeneratedProxy的实际成员

public class FacadeServiceClient : IServiceClient
{
    private WSDLGeneratedProxy clientProxy;
}

所以我的问题是 - 我应该明确地在服务代理上调用Dispose方法吗?这是正确的方法吗?

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        if (clientProxy != null)
        {
            clientProxy.Dispose();
        }
    }
}

非常感谢任何建议或意见。

1 个答案:

答案 0 :(得分:-1)

我没有看到你必须处理该对象的任何原因,当它不再使用时,它将被垃圾收集。

IDisposable接口基础用途是处理非托管对象(检查Proper use of the IDisposable interface

这就是为什么我们将using用于例如FileStream

等System.IO类的原因
      using (var fs = new FileStream(filePath, mode)) 
       {
              //use fs 
       }

当编译器遇到using关键字时,它会将代码重写为

        FileStream fs = new FileStream(filePath, mode); 
        try 
        {
            //use fs
         }
        finally 
        {
            //compiler will automatically call dispose on the FileStream to free up unmanaged objects
             fs.Dispose(); 
         }

您可能还希望在处理内存中的大型对象(例如数百MB)时使用dispose,并且不希望等待GC收集它们,而是提前执行它。

如果您没有遇到上述任何一种情况,那么GC肯定会在处理对象方面做得比您做的更好。