Castle Windsor:我的瞬态组件会被垃圾回收吗?

Posted

技术标签:

【中文标题】Castle Windsor:我的瞬态组件会被垃圾回收吗?【英文标题】:Castle Windsor: Will my transient component be garbage collected? 【发布时间】:2010-10-09 09:07:12 【问题描述】:

使用 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 是否会保留引用?我找到了this similar question,这意味着后者可能是这种情况 - 但在检查了那里发布的链接之后,我不确定讨论是关于保留引用,还是关于确保对象在实现 IDisposable 时被处置.我的对象不需要被处置。

如果 Castle Windsor 保留实例,是否有任何简单的方法可以防止这种情况(可能通过配置)?

编辑 看来,我需要设置发布跟踪政策。这可以在 xml 配置文件中配置,还是需要在代码中设置?是否可以按组件设置发布跟踪策略?

【问题讨论】:

【参考方案1】:

默认情况下,容器包含对您的对象(甚至是临时对象)的引用。

但是,正如@Bittercoder 在Why does Castle Windsor hold onto transient objects? 中指出的那样,您可以change the release tracking policy。似乎选择了

LifecycledComponentsReleasePolicy:

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

但自从提出问题以来,这似乎已成为默认策略。

【讨论】:

谢谢。您知道这是否可以基于每个组件进行配置? (请参阅我的问题的编辑) 我不这么认为。我实际上并没有使用 Castle(我想),但文档似乎表明它是内核范围的。我不确定这是否是正确的做法,但可以添加一个关注您的组件类型的自定义策略... 发布策略的设置是容器范围的。事实上,有文档指定发布策略的设置是创建容器实例后必须完成的第一件事。如果不遵循此规则,则某些组件将使用特定的发布策略创建,而其他组件将使用不同的策略。这可能会导致很可能导致内存泄漏。 页面不见了。你能举个例子吗? (这就是为什么链接在答案中不好。)【参考方案2】:

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

【讨论】:

没查出处,但Reflector似乎暗示DefaultKernel构造函数中确实是这样。方便知道,谢谢! 这到底是什么意思?泄漏不应该是瞬态问题吗?

以上是关于Castle Windsor:我的瞬态组件会被垃圾回收吗?的主要内容,如果未能解决你的问题,请参考以下文章

Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0

castle windsor学习-----Inline dependencies 依赖

依赖注入 Castle.Windsor高级应用

Castle.Windsor依赖注入的高级应用

使用 Castle Windsor 进行 WCF 依赖注入 - 请帮忙?

Castle Windsor 学习-----Installer的几种安装方式