Haruskah objek yang dibuat oleh IDisposable yang mereferensikan penciptanya membuang pencipta tersebut?

Saya memiliki kelas yang mengimplementasikan IDisposable menurut pola ini karena itu berisi referensi ke HttpClient. Ini terlihat seperti ini:

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
}

Saya ingin tahu apakah ServiceCreatedEntity harus mengimplementasikan IDisposable dan membuang CustomServiceClient. Saya berharap CustomServiceClient umumnya memiliki masa pakai lebih lama daripada ServiceCreatedEntity, dan saya khawatir klien akan membuang ServiceCreatedEntity dan bingung mengapa CustomServiceClient mereka juga dibuang. Tip apa pun akan sangat dihargai!


person Andrew Gaspar    schedule 30.06.2014    source sumber
comment
Tidak yakin apakah ini membantu, tapi ini mengingatkan saya pada pertanyaan ini. TL, DR: StreamReader, StreamWriter, BinaryReader, dan BinaryWriter semuanya menutup/membuang aliran dasarnya saat Anda memanggil Dispose pada aliran tersebut. Juga terkait, TL,DR: Jika Anda menyerahkan GC padanya, itu akan memanggil Dispose(false) yang tidak akan membuang aliran yang mendasarinya.. Hanya untuk memberi Anda gambaran tentang situasi serupa di .NET   -  person tnw    schedule 30.06.2014
comment
@tnw - Saya memikirkan hal itu. Saya kira saya dapat memberikan dokumentasi kepada pengguna saya yang menyarankan mereka hanya membuang ServiceCreatedEntity jika mereka juga sudah selesai dengan klien. Namun perbedaannya di sini adalah StreamReaders/Writers/etc. dibuat secara eksplisit dengan operator baru (RAII dan sebagainya), sehingga pembuatnya diharapkan memiliki objek tersebut, sedangkan ServiceCreatedEntity dipakai dan dikembalikan oleh CustomServiceClient, yang menunjukkan bahwa mungkin pembuatnya tidak memilikinya.   -  person Andrew Gaspar    schedule 01.07.2014


Jawaban (3)


ini lebih merupakan pertanyaan tentang apa yang menciptakan apa... pembuatnya (biasanya) harus menangani pembongkaran di dunia yang berorientasi pada permintaan.

person T McKeown    schedule 30.06.2014

ServiceCreatedEntity tidak boleh membuang klien, tetapi jika memiliki ketergantungan pada klien tidak ada salahnya untuk menyertakan properti IsDisposition atau peristiwa Disducing pada klien sehingga ServiceCreatedEntity dapat memverifikasi bahwa klien tidak dibuang sebelum menggunakannya, atau hanya memiliki CustomServiceClient menimbulkan kesalahan jika digunakan setelah pembuangan.

person Eric Scherrer    schedule 30.06.2014

Saya bingung mengapa CustomServiceClient memiliki metode yang mengembalikan ServiceCreatedEntity namun ServiceCreatedEntity menggunakan CustomServiceClient sebagai parameter dalam konstruktornya.

Umumnya, jika suatu benda dilewatkan, benda itu tidak boleh dibuang ke benda itu. Jika suatu objek membuat IDisposable maka objek itu sendiri harus mengimplementasikan IDisposable dan membuangnya. Untuk keadaan lainnya (seperti wadah IoC, atau sesuatu yang mewah), pertimbangkan umur benda tersebut dan kapan akan dibuang.

Lihat pertanyaan ini untuk informasi selengkapnya tentang IDisposable.

person Caleb Jares    schedule 30.06.2014