Если в Singleton реализована функция IDisposable, каков правильный способ удаления и повторного создания экземпляра? Один из способов - сохранить флаг _disposed и проверить его в свойстве Instance, но я не уверен, что это правильный способ сделать это. Простой пример:
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);
}
}
}
Так что код, которому нравится это, возможно (хотя, да, я согласен, это отчасти побеждает цель наличия Singleton):
Singleton.Instance.Dispose();
Singleton.Instance.Unmanaged.UseResource(); // Unmanaged shouldn't be null.
ПРИМЕЧАНИЕ: Нет необходимости переоценивать несовместимость между Singleton и IDisposable, я так понимаю. Мне нужен метод Dispose для освобождения неуправляемых ресурсов при выгрузке ApppDomain. Если у вас есть проблема с тем, что этот класс называется Singleton, я могу переименовать его в LoadBalancer. Вопрос останется прежним. Этот LoadBalancer должен быть одноразовым, потому что его экземпляр не принадлежит никому, но должен быть правильно утилизирован.