繁体   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