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 配置文件中配置,还是需要在代码中设置?是否可以按组件设置发布跟踪策略?

4

2 回答 2

9

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

然而,正如@Bittercoder 在温莎城堡为什么会保留瞬态物体?,您可以更改发布跟踪策略。似乎选择

LifecycledComponentsReleasePolicy

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

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

于 2009-02-23T18:09:42.207 回答
1

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

于 2009-03-25T17:40:20.793 回答