最近我注意到我的应用程序似乎正在吃掉永不释放的内存.在使用CLRProfiler进行分析后,我发现我使用的Castle Windsor容器正在抓住物体.这些对象在config xml中使用lifestyle ="transient"属性声明.
我发现如果我明确调用IWindsorContainer.Release(hangingObject)
它会丢弃它的引用.
这引起了一个问题,我并没有想到,对于一个短暂的生活方式对象,CastleWindsor会保留一个引用并有效地创建泄漏.这将是一个相当普通且容易出错的任务,在所有适当的位置插入显式的Release调用.
你有没有看到这个问题,你有什么建议可以解决这个问题吗?
我认为这里的答案缺少一个重要的观点 - 这种行为可以通过发布政策开箱即用 - 在这里查看城堡项目网站上的文档.
在许多情况下,特别是在托管应用程序的生命周期中容器存在的情况下,以及真正不需要跟踪瞬态组件的情况(因为您正在处理调用代码或已注入服务的组件中的处理),那么您可以将发布策略设置为NoTrackingReleasePolicy
实现并使用它完成.
在Castle v 1.0之前,我相信Component Burden将被实现/引入 - 这将有助于缓解一些这些问题以及处理注入的依赖项等.
编辑:
有关组件负担的更多讨论,请查看以下帖子.
组件负担 - 戴维Brions
此外,组件负担也在Windsor Container 的官方2.0版本中实现.