使用温莎城堡,我有一个配置了瞬态生活方式的组件:
<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 是否会保留引用?我发现这个类似的问题 https://stackoverflow.com/questions/132940/why-does-castle-windsor-hold-onto-transient-objects,这意味着后者可能是这种情况 - 但在检查了那里发布的链接后,我不确定讨论是关于保留引用,还是关于确保对象在实现 IDisposable 时被处置。我的物品不需要被处置。
如果温莎城堡保留该实例,是否有任何简单的方法可以防止这种情况(也许通过配置)?
EDIT
看来我需要设置发布跟踪策略。可以在xml配置文件中配置,还是需要在代码中设置?可以针对每个组件设置发布跟踪策略吗?
默认情况下,容器保存对对象(甚至是瞬态对象)的引用。
然而,正如 @Bittercoder 中指出的那样为什么温莎城堡会抓住瞬态物体? https://stackoverflow.com/questions/132940/why-does-castle-windsor-hold-onto-transient-objects, 你可以更改发布跟踪策略 https://github.com/castleproject/Windsor/blob/aa9b8b353ee2e533d586495eec254e216f800c09/docs/release-policy.md。看来选择
LifecycledComponentsReleasePolicy
:
var policy = container.Kernel.ReleasePolicy;
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy;
但自从这个问题被提出以来,这似乎已经成为默认政策。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)