为什么温莎要跟踪一些组件,而有些则不跟踪
本文关键字:跟踪 组件 为什么 | 更新日期: 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=true
和trackedExternally=false
创建实例Burden
时,实例会被跟踪,但我找不到requiresDecommission
true
的情况。
谁能给我一个提示,如果有问题或我可以继续搜索以启用对所有组件的跟踪?还是调试器输出完全错误?
温莎会确定它是否需要跟踪你的对象。它可能是因为组件或其依赖项之一实现了 IDisposable 或出于许多其他原因。一般来说,你不应该关心为什么。它实际上是容器的实现细节。
您可以使用需要它的生活方式来启用跟踪,但我认为这对您的问题没有帮助。
温莎避免内存泄漏的非常简单的规则是释放您解决的所有内容。