为什么Castle Windsor能够抓住瞬态物体?

时间:2008-09-25 12:16:09

标签: c# castle-windsor

最近我注意到我的应用程序似乎正在吃掉永不释放的内存。在使用CLRProfiler进行分析后,我发现我使用的Castle Windsor容器正在抓住物体。这些对象在config xml中使用lifestyle =“transient”属性声明。

我发现如果我明确调用IWindsorContainer.Release(hangingObject),它会删除它的引用。

这引起了一个问题,我没想到,对于一个短暂的生活方式对象,CastleWindsor会保留一个引用并有效地创建泄漏。这将是一个相当普通且容易出错的任务,在所有适当的地方插入显式的Release调用。

你有没有看到这个问题,你有什么建议可以解决这个问题吗?

3 个答案:

答案 0 :(得分:20)

我认为这里的答案缺少一个重要的观点 - 这种行为可以通过发布政策开箱即用 - 查看城堡项目网站here上的文档。

在许多情况下,特别是在托管应用程序的生命周期内容器存在的情况下,以及实际上不需要跟踪瞬态组件的情况(因为您正在处理调用代码或已注入服务的组件中的处理)然后你可以将发布策略设置为NoTrackingReleasePolicy实现并完成它。

在Castle v 1.0之前,我相信Component Burden将被实现/引入 - 这将有助于缓解一些这些问题以及处理注入的依赖项等。

修改

有关组件负担的更多讨论,请查看以下帖子。

The Component Burden - Davy Brions

此外,组件负担也在Windsor Container的official 2.0 release中实施。

答案 1 :(得分:2)

有一点需要注意的是,这似乎已在Castle Trunk中得到修复。在r5475中,Hammett将MicroKernel中的默认发布策略更改为LifecycledComponentsReleasePolicy

答案 2 :(得分:1)

您可以在容器中的对象上设置单身或瞬态的生活方式。我理解的Singleton对象应该持续应用程序的生命周期,但我不明白这个behvaviour对于瞬态对象的用处是否相同!

可以通过实施ILifestyleManager来创建自定义生活方式。也许有可能适当地实现这个以创建ReallyTransient生活方式类型!