为什么温莎城堡会抓住瞬态物体?

时间:2020-03-06 14:43:01  来源:igfitidea点击:

最近,我注意到我的应用程序似乎正在消耗永不释放的内存。在使用CLRProfiler进行分析后,我发现我正在使用的Castle Windsor容器保留了对象。这些对象在config xml中使用Lifestyle =" transient"属性声明。

我发现如果我显式调用IWindsorContainer.Release(hangingObject),它将删除其引用。

不过,这引起了一个问题,我没想到使用临时生活方式对象CastleWindsor会保留引用并有效地造成泄漏。在所有适当的位置插入显式Release调用将是一个相当平凡且容易出错的任务。

我们是否看到过这个问题,并且对如何解决这个问题有任何建议吗?

解决方案

尽管可以在容器中的对象上设置单身或者短暂的生活方式。我了解的Singleton对象应该可以维持应用程序的生命周期,但是我不理解这种行为对于瞬态对象的有用性!

可以通过实现" ILifestyleManager"来创建自定义的生活方式。也许可以适当地实现此功能以创建" ReallyTransient"生活方式类型!

我认为这里的答案缺少一个关键点,即可以通过发布策略立即配置此行为,请查看此处城堡项目站点上的文档。

在许多情况下,特别是在托管应用程序的生命周期中存在容器且确实不需要跟踪临时组件的情况下(因为我们正在处理注入到服务中的调用代码或者组件中的处置),只需将发布策略设置为" NoTrackingReleasePolicy"实现即可完成此操作。

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

编辑:

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

组成部分负担戴维·布里恩斯

在Windsor Container的官方2.0版本中也实现了组件负担。

要注意的一件事是,这似乎已在城堡主干中修复。在r5475中,Hammett将MicroKernel中的默认发布策略更改为" LifecycledComponentsReleasePolicy"。