Entsorgung eine singleton-Instanz (C#)

Wenn ein singleton implementiert IDisposable, was ist die richtige Art und Weise der Entsorgung und re-erstellen einer Instanz? Eine Möglichkeit wäre, halten _disposed Flagge und überprüfen Sie es in die Instanz-Eigenschaft, aber ich bin nicht sicher, es ist der richtige Weg, dies zu tun. Ein einfaches Beispiel:


public sealed class Singleton: IDisposable
{
   private static Singleton _instance;
   private object _lock;
   private UnmanagedResource _unmanaged;
   private bool _disposed;

   private Singleton()
   {
      _unmanaged = new UnmanagedResource();
      _disposed  = false;
      _lock      = new object();
   }

   public UnmanagedResource Unmanaged { get { return _unmanaged; } }

   public static Singleton Instance
   {
      get
      {
         if (_instance == null || _disposed)
         {
            lock (_lock)
            {
               if (_instance == null || _disposed)
               {
                  _instance = new Singleton();
               }
            }
         }
         return _instance;
      }
   }

   public void Dispose()
   {
      _disposed = true;
      try
      {
         _unmanaged.Dispose();
      }
      finally
      {
         GC.SuppressFinalize(this);
      }
   }
}

So, dass code mag dies möglich ist (obwohl, ja, ich Stimme zu, es Art von Niederlagen der Zweck des habens ein Singleton):


Singleton.Instance.Dispose();
Singleton.Instance.Unmanaged.UseResource();   //Unmanaged shouldn't be null.

HINWEIS: gibt Es keine Notwendigkeit zu betonen Inkompatibilität zwischen Singleton-und IDisposable, ich verstehe es. Ich brauche Dispose-Methode nicht verwaltete Ressourcen frei, wenn ApppDomain entlädt. Wenn Sie ein problem mit dieser Klasse aufgerufen wird, Singleton, ich kann es umbenennen, LoadBalancer statt. Die Frage bleibt dennoch die gleiche. Diese LoadBalancer werden muss, Einweg, weil es die Instanz, die niemandem gehört, sondern sollten ordnungsgemäß entsorgt werden.

warum haben Sie einen singleton in den ersten Platz?
sichern UnamanagedResource und bieten load-balancing für die Nutzung dieser resouse

InformationsquelleAutor kateroh | 2011-06-03

Schreibe einen Kommentar