【问题标题】:Castle Windsor when is transient with disposable released? Burden温莎城堡什么时候一次性发布?负担
【发布时间】:2012-11-02 21:56:11
【问题描述】:

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

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

【问题讨论】:

    标签: castle-windsor lifecycle transient


    【解决方案1】:

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

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

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

    解决您所指的特定问题,这听起来像是一个旧的线程错误,在此过程中的某个地方已修复。升级的另一个理由。

    【讨论】:

    • 很遗憾,我还没有这个选项,但看起来这是前进的方向。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多