2

我们使用的是温莎城堡 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()

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

4

2 回答 2

4

Vesion 2.1 即将迎来它的 4 岁生日。我强烈建议您升级到 3.1 版。

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

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

解决您所指的特定问题,这听起来像是一个旧的线程错误,该错误已在沿途某处修复。升级的另一个原因。

于 2012-11-14T20:53:04.563 回答
0

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

默认情况下(您绝对应该坚持...)所有组件都由容器跟踪/拥有...这就是温莎之美!

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

如此说来,注册为 Transient 的组件应该仅被称为 w/composition root,换句话说,它只是作为依赖图的第一个对象或通过工厂(后期依赖)。当然请记住,在依赖图中使用工厂可能需要实现 RRR 模式显式。

于 2012-11-14T18:08:03.390 回答