Castle Windsor什么时候是一次性释放?负担

时间:2012-11-14 11:47:39

标签: castle-windsor lifecycle transient

我们正在使用Castle Windsor 2.1.0.6655。

我想为我已解决的对象使用瞬态生命周期,但我想检查这个版本的Castle如何处理具有依赖关系的瞬态。如果我使用我的即时窗口(visual studio),我可以看到解析,处理和最终重新发布的效果,一直检查已解析的对象是否已被释放。

例如

resolved = container.Resolve(Id);

container.Kernal.ReleasePolicy.HasTrack(resolved)
= true

resolved.Dispose()
container.Kernal.ReleasePolicy.HasTrack(resolved)
= true

container.release(resolved)
container.Kernal.ReleasePolicy.HasTrack(resolved)
= false

我担心的是这些对象会在请求之间继续跟踪,因为它们永远不会被释放,这意味着内存使用率会持续上升。

我已经读过Component Burden与此问题有关,但我无法确切地知道Castle 2.0及更高版本中的内容。

“释放”的困难在于,已解析的对象实际上是服务的一部分,它们的用途是提供ORM功能和映射。我不确定在这些情况下引用要发布的容器是否正确。

我想知道是否有办法让我看到容器在给定点引用了多少个对象,而不必使用内存分析器,因为我们没有这个。

我想我可以使用以下内容:

container.Kernel.GetHandlers()

我正在寻找的类型,看看跟踪的事件是否在增加?

2 个答案:

答案 0 :(得分:4)

Vesion 2.1将很快庆祝其4岁生日。我强烈建议您升级到3.1版。

不仅因为不再支持v2.1而且v3.1更新,有许多错误修正,而且它在跟踪方式方面也有一些重大改进。

同样在v3.1中,您将能够启用性能计数器,该计数器将实时报告发布策略跟踪的实例数。

解决您所指的特定问题,这听起来像是一个旧的线程错误,它已经被修复了。升级的另一个原因。

答案 1 :(得分:0)

windsor必须与R(egister)R(esolve)R(elease)模式一起使用。

默认情况下(你肯定应该坚持......)所有组件都被容器跟踪/拥有......这就是温莎之美!

在您(或容器本身)调用Release之前,无论您是直接调用Dispose(根据您的示例),实例都将保留在内存中。

这样说,注册为Transient的组件应该仅在其他词中被称为组合根,作为依赖图的第一个对象或通过工厂(后期依赖)。 当然要记住,在依赖图中使用factory,您可能需要实现RRR模式expliclty。