我知道这个问题已经被反复讨论了...但是我对Windsor跟踪短暂的IDisposable对象的方式有问题。
我理解让Windsor管理我的IDisposable对象的好处...但我不喜欢它。
如果我想在using块中包装我的组件会发生什么?程序员会假设资源会在using块结束时得到清理,对吧?错了-Dispose会被调用,但Windsor会保留实例直到显式释放。对于我来说,这很好,因为我知道我在做什么...但是另一个开发人员要编写一个类并想要像通常使用其他IDisposable一样在using块中使用IDisposable呢?
using(factory.CreateInstance())
{
....
}
对我来说,看起来比:
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
为了真正地处理我的实例并使它们有资格进行垃圾回收,我需要引用WindsorContainer或使用一个公开释放方法的类型化工厂。这意味着使用IDisposable组件的唯一可接受方式是使用类型化工厂。在我看来,这并不好...如果有人将IDisposable接口添加到现有组件中,那该怎么办呢?每个希望注入该组件的地方都需要更改。在我看来,这真的很糟糕。(当然,在非DI场景下,也需要更改以调用Dispose...但是使用Windsor时,每个地方都需要更改以使用类型化工厂,这是一次更大的变化)。好的,可以使用自定义ReleasePolicy,怎么样?
public class CustomComponentsReleasePolicy : AllComponentsReleasePolicy
{
public override void Track(object instance, Burden burden)
{
if (burden.Model.LifestyleType == LifestyleType.Pooled)
base.Track(instance, burden);
}
}
好的,太棒了,我的IDisposable瞬态组件现在将被垃圾回收。
如果我想使用TypedFactory让我的类生产一个类型的多个实例怎么办?
public interface IMyFactory
{
MyDisposable GetInstance();
void Release(MyDisposable instance);
}
[Singleton]
public class TestClass
{
public TestClass(IMyFactory factory) { }
}
首先,调用工厂的Release方法不会对MyDisposable调用Dispose()方法,因为MyDisposable没有被跟踪......
我该如何克服这些困难呢?
谢谢。