【发布时间】:2016-10-28 15:02:15
【问题描述】:
我正在使用 Castle Windsor Typed Factory。在我们的注册码中,它被设置成可以创建一个 Transient 组件:
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IThingFactory>().AsFactory());
container.Register(Component.For<IThing>().ImplementedBy<TransientObject>().Named("TransientObject").LifeStyle.Transient);
根据我对the Castle Windsor Typed Factory documentation 的理解,我认为瞬态对象必须由类型化工厂方法释放,否则类型化工厂将保留对该对象的引用。我试图通过编写一个使用this StackOverflow article 中解释的方法的测试来证明这一点。
但令我惊讶的是它实际上并没有失败,这意味着虽然我没有将瞬态对象释放回工厂,但它仍然可以被 GC 回收。我担心我的测试可能具有误导性,并且确实存在泄漏。
所以我的问题是:我的测试错了,还是文档错了?
这是测试:
var factory = container.Resolve<IThingFactory>();
WeakReference reference = null;
new Action(() =>
{
var service = factory.GetTransientObject();
reference = new WeakReference(service, true);
})();
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.That(reference.Target, Is.Null, "reference should be null");
【问题讨论】:
-
有什么问题?
-
您的“ITing”是否扩展/实现了 IDisposable 接口?上面写着“Windsor 总是跟踪通过类型化工厂解析的一次性非单件组件。”。
-
我认为 piotrwest 已经回答了我的问题:不,我的 IThing 没有实现 IDisposable。我错过了“Windsor 总是跟踪 disposable...”的含义。谢谢!
标签: c# inversion-of-control castle-windsor