簡體   English   中英

DI:處理IDisposable對象的壽命

[英]DI: Handling Life of IDisposable Objects

因此,我正在研究我的DI / IoC容器OpenNETCF.IoC ,我有一個(合理的)功能請求,為容器集合中的IDisposable項目添加某種形式的生命周期管理。

我目前的想法是,由於無法查詢對象是否已被處置,並且無法獲得事件處置的事件,因此我必須為開發人員想要的對象創建某種形式的包裝器要管理的框架。

現在可以使用AddNew添加對象(為簡單起見,我們假定只有一個重載,沒有Add):

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

我正在考慮添加一種新方法(很好的組合,但是您會看到圖片):

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

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;
        }
    }
}

現在,當通過AddNewDIsposable將某項添加到容器時,還會添加一個事件處理程序,以便當該事件通過包裝器被Dispose時,框架會將其從基礎集合中刪除。

我實際上已經實現了它,並且正在通過單元測試,但是我正在尋找關於可能會破壞它或如何使它對使用中的開發人員更“友好”的意見。

編輯1

由於存在有關如何使用Dispose事件的問題,因此這里有一些代碼(修剪至重要內容):

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);
}

也許我缺少了一些東西,但是為什么要向API添加新方法呢? 將對象添加到容器后,可以進行鑄態檢查以檢查其IDisposposable並適當地對其進行處理。

我也想知道您是否需要析構函數。 假設容器是IDisposable的(像Unity一樣),則可以實現Basic Dispose Pattern並節省大量GC開銷。

可能適用的一些問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM