Tuesday, December 4, 2012

A great way to define a class with disposing

If you are creating a class that hold unmanaged resources or 'fat' managed resources you want released immediately (instead of waiting for the GC), you can implement them like this pattern or like this:

In the project, define these two classes:


public interface IDisposer : IDisposable
{    
    void Initialize(Action disposeCallback);

    public class Disposer : IDisposer 
    {
        private readonly Action _disposeCallback;

        public void Initialize(Action disposeCallback) 
        {
            _disposeCallback = disposeCallback;
        }

        public void Dispose() 
        {
            _disposeCallback(true);
        }
    }
}

public interface IDisposerFactory : IDisposable
{
    IDisposer Create(Action disposeAction);
}


Then use this pattern when defining new class that have the unmanaged/fat resources:


pubic class YourBuggyClass : IDisposable
{
    private readonly IDisposer _disposer;

    public YourBuggyClass(IDisposerFactory disposerFactory)
    {
        _disposer = disposerFactory.create((disposing) => 
                    DoRealDispose(disposing));
    }

    private void DoRealDispose(bool disposing) {
        // dispose your unmanaged/fat stuff here
    }

    public void Dispose() 
    {
        _disposer.Dispose();
    }
}

No comments:

Post a Comment