C# 温莎城堡:我的瞬态组件会被垃圾收集吗?

C# 温莎城堡:我的瞬态组件会被垃圾收集吗?,c#,.net,castle-windsor,transient,C#,.net,Castle Windsor,Transient,使用Castle Windsor,我有一个配置了瞬态生活方式的组件: <component id="publish.mapping.default" service="IMyService, MyAssembly" type="MyServiceImplementation, Myassembly" lifestyle="transient" /> 将像这样使用:

使用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 ... 
var-service=container.Resolve(componentId);
//服务使用。。。。
//服务超出范围。。。
我的问题是,服务实例是否会在超出范围后被垃圾收集,或者Castle Windsor是否会保留引用?我发现,这意味着后一种情况可能是这样的——但在检查了发布在那里的链接后,我不确定讨论是关于保留引用,还是关于确保对象在实现IDisposable时被释放。我的对象不需要处理

如果Castle Windsor保留了该实例,是否有任何简单的方法来防止(可能通过配置)

编辑

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

默认情况下,容器包含对对象的引用(即使是临时对象)

但是,正如@bitercoder在中所指出的,您可以。看来选择

LifecycledComponentsReleasePolicy

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

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

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

谢谢。您知道是否可以根据每个组件进行配置吗?(见我问题的编辑)我不这么认为。我实际上没有使用Castle(我很想),但文档似乎表明它是内核范围的。我不确定这样做是否正确,但可能会添加一个关注组件类型的自定义策略…发布策略的设置是容器范围的。事实上,有文档规定,设置发布策略是创建容器实例后必须首先做的事情之一。如果不遵循此规则,则将使用特定的发布策略创建某些组件,而使用其他发布策略创建其他组件。这可能导致内存泄漏的可能性很高。页面已丢失。你能举个例子吗?(这就是为什么链接在回答中不好。)我还没有检查源代码,但Reflector似乎表明DefaultKernel构造函数中确实存在这种情况。很高兴知道,谢谢!那么这到底意味着什么呢?泄漏不应该是瞬态的问题?