gpt4 book ai didi

c# - DI : Handling Life of IDisposable Objects

转载 作者:太空狗 更新时间:2023-10-29 19:44:41 25 4
gpt4 key购买 nike

所以我正在开发我的 DI/IoC 容器 OpenNETCF.IoC我有一个(合理的)功能请求,要求为容器集合中的 IDisposable 项目添加某种形式的生命周期管理。

我目前的想法是,因为我无法查询一个对象以查看它是否已被处置,并且我无法获得它何时被处置的事件,所以我必须为对象创建某种形式的包装器开发人员希望框架进行管理。

现在可以使用 AddNew 添加对象(为简单起见,我们假设只有一个重载而没有添加):

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 添加到容器时,还会添加一个事件处理程序,以便在它被释放时(通过包装器)框架将其从底层集合中删除。

我实际上已经实现了它并且它正在通过单元测试,但我正在寻找关于它可能在哪里被破坏的意见,或者如何让它对消费开发者更“友好”。

编辑 1

由于有一个关于如何使用 Disposing 事件的问题,这里有一些代码(根据重要内容进行了修剪):

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 添加新方法?当一个对象被添加到容器中时,您可以 as-cast 来检查它是否是 IDisposable 并在是的情况下适本地处理它。

我还想知道您是否需要析构函数。假设容器是 IDisposable(如 Unity 的),您可以只实现 Basic Dispose Pattern并节省大量 GC 开销。

一些可能适用的问题:

关于c# - DI : Handling Life of IDisposable Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com