Castle Windsor:我的短暂组件会被垃圾回收吗?

6
使用Castle Windsor,我配置了一个瞬态生命周期的组件:
<component id="publish.mapping.default"
                   service="IMyService, MyAssembly"
                   type="MyServiceImplementation, Myassembly" 
                   lifestyle="transient" />

这将会被使用如下:

var service = container.Resolve<IMyService>(componentId);
// service usage ....
// service goes out of scope ... 

我的问题是,当服务实例超出范围后,它是否会被垃圾回收,还是Castle Windsor会保留引用?我找到了这个类似的问题,暗示后者可能是情况 - 但在检查那里发布的链接后,我不确定讨论是关于保持引用还是确保对象在实现IDisposable时被处理。我的对象不需要被处理。
如果Castle Windsor保留实例,则是否有任何简单的方法可以防止这种情况发生(例如通过配置)?
编辑 看来,我需要设置释放跟踪策略。这可以在xml配置文件中配置吗,还是需要在代码中设置?可以按组件设置释放跟踪策略吗?
2个回答

9

默认情况下,容器会持有您的对象的引用(即使是短暂的对象)。

然而,正如@Bittercoder在为什么Castle Windsor会保留短暂对象?中所指出的那样,您可以更改释放跟踪策略。似乎选择

LifecycledComponentsReleasePolicy

var policy = container.Kernel.ReleasePolicy;
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy;

但自从有人提出这个问题后,这似乎已经成为默认政策。


谢谢。你知道这个能否按组件进行配置吗?(请参见我问题的编辑) - driis
我不这么认为。实际上我并没有使用Castle(我很想用),但文档似乎表明它是内核级的。我不确定这是否正确,但可能可以添加一个自定义策略来关注您的组件类型... - Blair Conrad
发布策略的设置是容器范围内的。实际上,有文件说明在创建容器实例后必须首先设置发布策略。如果不遵循此规则,则某些组件将使用特定的发布策略创建,而其他组件将使用不同的发布策略创建。这可能会导致内存泄漏的高概率发生。 - Chai
页面已经不存在。你能给一个例子吗?(这就是为什么在答案中使用链接不好的原因。) - Sinaesthetic

1

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


还没有检查源代码,但反射器似乎表明这确实是DefaultKernel构造函数中的情况。很有用的信息,谢谢! - Gavin
那这真的意味着什么?这意味着短暂的情况下泄漏不应该成为一个问题吗? - Sinaesthetic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接