我们正在使用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()
我正在寻找的类型,看看跟踪的事件是否在增加?
答案 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。