使用温莎城堡,我有一个配置了短暂生活方式的组件:

<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 ...

我的问题是,服务实例超出范围后会被垃圾回收,还是温莎城堡保留引用?我发现this similar question,这意味着后者可能是这种情况-但是在检查了此处发布的链接之后,我不确定讨论是关于保留引用,还是关于确保对象实现IDisposable时是否将其处置。我的对象不需要处置。

如果温莎城堡坚持使用该实例,是否有任何简单的方法来防止这种情况发生(可能是通过配置)?

编辑
看来,我需要设置发布跟踪策略。可以在xml配置文件中进行配置,还是需要在代码中进行设置?可以基于每个组件设置发布跟踪策略吗?

最佳答案

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

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

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

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

关于c# - 温莎城堡: Will my transient component be garbage collected?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/578593/

10-10 14:01