引用其创建者的IDisposable创建的对象是否应该处置该创建者?

时间:2014-06-30 19:27:47

标签: c# idisposable object-lifetime

我有一个根据this pattern实现IDisposable的类,因为它包含对HttpClient的引用。它看起来像这样:

public class CustomServiceClient : IDisposable
{
  HttpClient client;

  // ...

  public ServiceCreatedEntity GetEntity()
  {
    // ...
  }

  ~CustomServiceClient()
  {
    this.Dispose(false);
  }

  private bool disposed = false;
  void IDisposable.Dispose()
  {
    if(!disposed)
    {
      this.Dispose(true);
      GC.SuppressFinalize(this);
      disposed = true;
    }
  }

  public void Dispose(bool disposing)
  {
    if(disposing)
    {
      // dispose managed resources
      client.Dispose();
    }

    // dispose unmanaged resources - this class has none
  }
}

public class ServiceCreatedEntity
{
  CustomServiceClient client;

  public ServiceCreatedEntity(CustomServiceClient client)
  {
    this.client = client;
  }

  // some functions that use client
}

我想知道ServiceCreatedEntity是否应该实现IDisposable并处理CustomServiceClient。我希望CustomServiceClient的生命周期通常比ServiceCreatedEntity更长,我担心客户会处置ServiceCreatedEntity,并对其CustomServiceClient的原因感到困惑已经被处理掉了。任何提示将不胜感激!

3 个答案:

答案 0 :(得分:1)

更多的是什么创造了什么......创造者应该(通常)处理面向请求的世界中的拆解。

答案 1 :(得分:0)

ServiceCreatedEntity不应该处置客户端,但是如果它对客户端有依赖性,那么在客户端上包含IsDisposed属性或Disposing事件并使ServiceCreatedEntity可以在使用之前验证客户端没有被处置是没有坏处的,或者只是让CustomServiceClient在处理后使用时抛出错误。

答案 2 :(得分:0)

我很困惑为什么CustomServiceClient有一个返回ServiceCreatedEntity的方法,而ServiceCreatedEntity在其构造函数中将CustomServiceClient作为参数。

通常,如果传入对象,则不应将其置于该对象中。如果对象创建了IDisposable,它本身应该实现IDisposable并处理它。对于任何其他情况(例如IoC容器或某些花哨的东西),请考虑对象的生命周期以及何时处置它。

有关IDisposable的更多信息,请查看this question