我目前在WPF应用程序(.NET 4.0,Castle Windsor 3.2.1)中遇到了一些内存泄漏问题。 Thatswhy我偶然发现了一个效果,我无法解释。我想,Windsor默认跟踪每个已解析的组件(LifecycledComponentsReleasePolicy
),但是当我查看调试器输出时,情况似乎总是如此。
例如,有两个类(在一堆中),如下所示:
public class ViewOne : UserControl, ITabPageView
{...}
和
public class ViewSecond : TabPageBase, ITabPageView<A>, ITabPageView
{...}
其中:
public class TabPageBase : UserControl, ITabPageView
{...}
和
public interface ITabPageView<T> : ITabPageView
{...}
两个View类都通过相同的组件注册(按照惯例)注册,如下所示:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<ITabPageView>()
.WithServices(typeof(ITabPageView)
.Configure(...setting the name of the component...)
.LifestyleTransient()
所以,当我现在解决第一个类的实例
时_container.Resolve<ITabPageView>("ViewOne"); // this is for explanation purposes only, not intended for production
我得到一个实例并查看容器显示的调试器输出,这个实例被发布策略跟踪#。
当我现在使用第二个类的名称(ViewSecond)执行完全相同的操作时,我也为类ViewSecond获取了一个正确的实例,但这并未显示在发布策略跟踪中#39 ;.更奇怪的是,ViewSecond的某些依赖关系显然是被跟踪的,但同样不是全部。一些人通过Windsor的代码透露,当用[{1}}和Burden
创建requiresDecommission=true
时,会跟踪这些实例,但我找不到一个案例,其中trackedExternally=false
会是requiresDecommission
。
任何人都可以给我一个提示,如果有什么问题,或者我可以继续搜索所有组件的跟踪功能吗?或者调试器输出是否完全错误?
答案 0 :(得分:2)
Windsor将确定是否需要跟踪您的对象。它可能会这样做,因为组件或其中一个依赖项实现了IDisposable或其他许多原因。一般你不应该在乎为什么。它实际上是容器的实现细节。
您可以通过使用需要它的生活方式启用跟踪,但我不会看到这有助于解决您的问题。
使用Windsor避免内存泄漏的非常简单的规则是释放您解决的所有内容。