DI: Obsługa życia obiektów IDisposable

Pracuję więc nad moim kontenerem DI / IoCOpenNETCF.IoC i mam (uzasadnione) żądanie funkcji, aby dodać pewną formę zarządzania cyklem życia dla elementów IDisposable w kolekcjach kontenerów.

Moje obecne myślenie jest takie, ponieważ nie mogę wysłać zapytania do obiektu, aby sprawdzić, czy został on usunięty, i nie mogę uzyskać zdarzenia, gdy zostanie ono usunięte, że muszę utworzyć jakąś formę opakowania dla obiektów, które chce programista ramy do zarządzania.

W tej chwili obiekty można dodawać za pomocą AddNew (dla uproszczenia założymy, że istnieje tylko jedno przeciążenie i nie ma Add):

public TTypeToBuild AddNew<TTypeToBuild>() { ... }

Zastanawiam się nad dodaniem nowej metody (dobrze grupy, ale otrzymujesz zdjęcie):

public DisposableWrappedObject<IDisposable> AddNewDisposable<TTypeToBuild>()
    where TTypeToBuild : class, IDisposable
{
    ...
}

Gdzie wygląda DisposableWrappedObject:

public class DisposableWrappedObject<T>
    where T : class, IDisposable
{
    public bool Disposed { get; private set; }
    public T Instance { get; private set; }

    internal event EventHandler<GenericEventArgs<IDisposable>> Disposing;

    internal DisposableWrappedObject(T disposableObject)
    {
        if (disposableObject == null) throw new ArgumentNullException();

        Instance = disposableObject;
    }

    ~DisposableWrappedObject()
    {
        Dispose(false);
    }

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

    protected virtual void Dispose(bool disposing)
    {
        lock(this)
        {
            if(Disposed) return;

            EventHandler<GenericEventArgs<IDisposable>> handler = Disposing;
            if(handler != null)
            {
                Disposing(this, new GenericEventArgs<IDisposable>(Instance));
            }

            Instance.Dispose();

            Disposed = true;
        }
    }
}

Teraz, gdy element zostanie dodany do kontenera za pośrednictwem AddNewDIsposable, dodawany jest także moduł obsługi zdarzeń, dzięki czemu po pobraniu go (za pomocą opakowania) struktura usuwa go z podstawowej kolekcji.

W rzeczywistości mam to zaimplementowane i przechodzi testy jednostkowe, ale szukam opinii o tym, gdzie może to być złamane, lub jak może być bardziej „przyjazne” dla konsumującego programisty.

EDYTUJ 1

Ponieważ istniało pytanie, w jaki sposób używane jest zdarzenie Disposing, oto trochę kodu (przyciętego do tego, co ważne):

private object AddNew(Type typeToBuild, string id, bool wrapDisposables)
{
    ....

    object instance = ObjectFactory.CreateObject(typeToBuild, m_root);

    if ((wrapDisposables) && (instance is IDisposable))
    {
        DisposableWrappedObject<IDisposable> dispInstance = new
               DisposableWrappedObject<IDisposable>(instance as IDisposable);
        dispInstance.Disposing += new 
               EventHandler<GenericEventArgs<IDisposable>>(DisposableItemHandler);
        Add(dispInstance as TItem, id, expectNullId);
        instance = dispInstance;
    }

    ....

    return instance;
}

private void DisposableItemHandler(object sender, GenericEventArgs<IDisposable> e)
{
    var key = m_items.FirstOrDefault(i => i.Value == sender).Key;
    if(key == null) return;
    m_items.Remove(key);
}

questionAnswers(1)

yourAnswerToTheQuestion