DI:处理IDisposable对象的生命

所以我正在研究我的DI / IoC容器OpenNETCF.IoC ,我有一个(合理的)function请求,为容器集合中的IDisposable项添加某种forms的生命周期管理。

我当前的想法是,因为我无法查询某个对象以查看它是否已被处置,并且我无法获得一个事件,因为它被处理掉了,我必须为开发人员想要的对象创建某种forms的包装器要管理的框架。

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

public TTypeToBuild AddNew() { ... } 

我正在考虑的是添加一种新方法(很好的一组,但你得到的图片):

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

DisposableWrappedObject的位置如下所示:

 public class DisposableWrappedObject where T : class, IDisposable { public bool Disposed { get; private set; } public T Instance { get; private set; } internal event EventHandler<GenericEventArgs> 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> handler = Disposing; if(handler != null) { Disposing(this, new GenericEventArgs(Instance)); } Instance.Dispose(); Disposed = true; } } } 

现在,当一个项目通过AddNewDIsposable添加到容器中时,还会添加一个事件处理程序,这样当它被Disposed(通过包装器)时,框架会从底层集合中删除它。

我实际上已经实现了这个并且通过了unit testing,但是我正在寻找关于这可能会被打破的意见,或者它如何对消费者开发者更“友好”。

编辑1

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

 private object AddNew(Type typeToBuild, string id, bool wrapDisposables) { .... object instance = ObjectFactory.CreateObject(typeToBuild, m_root); if ((wrapDisposables) && (instance is IDisposable)) { DisposableWrappedObject dispInstance = new DisposableWrappedObject(instance as IDisposable); dispInstance.Disposing += new EventHandler<GenericEventArgs>(DisposableItemHandler); Add(dispInstance as TItem, id, expectNullId); instance = dispInstance; } .... return instance; } private void DisposableItemHandler(object sender, GenericEventArgs e) { var key = m_items.FirstOrDefault(i => i.Value == sender).Key; if(key == null) return; m_items.Remove(key); } 

也许我错过了什么,但为什么要在API中添加新方法? 当一个对象被添加到容器中时,您可以转发以检查它是否是IDisposable并如果是这样适当地处理它。

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

一些可能适用的问题:

  • 你如何协调IDisposable和IoC?
  • 可以反转控制和RAII一起玩吗?