为什么温莎要跟踪一些组件,而有些则不跟踪

本文关键字:跟踪 组件 为什么 | 更新日期: 2023-09-27 17:56:23

我目前受到WPF应用程序(.NET 4.0,Castle Windsor 3.2.1)中一些内存泄漏的挑战。这就是为什么我偶然发现了一个效果,我无法解释。我想,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实例,但这不会显示在"按发布策略跟踪"中。更奇怪的是,ViewSecond 的某些依赖项显然被跟踪,但并非全部。一些挖掘温莎代码的人发现,当使用requiresDecommission=truetrackedExternally=false创建实例Burden时,实例会被跟踪,但我找不到requiresDecommission true的情况。

谁能给我一个提示,如果有问题或我可以继续搜索以启用对所有组件的跟踪?还是调试器输出完全错误?

为什么温莎要跟踪一些组件,而有些则不跟踪

温莎会确定它是否需要跟踪你的对象。它可能是因为组件或其依赖项之一实现了 IDisposable 或出于许多其他原因。一般来说,你不应该关心为什么。它实际上是容器的实现细节。

您可以使用需要它的生活方式来启用跟踪,但我认为这对您的问题没有帮助。

温莎避免内存泄漏的非常简单的规则是释放您解决的所有内容。