为什么Windsor会跟踪某些组件,有些则不然?

时间:2014-04-03 01:22:00

标签: c# castle-windsor ioc-container

我目前在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

任何人都可以给我一个提示,如果有什么问题,或者我可以继续搜索所有组件的跟踪功能吗?或者调试器输出是否完全错误?

1 个答案:

答案 0 :(得分:2)

Windsor将确定是否需要跟踪您的对象。它可能会这样做,因为组件或其中一个依赖项实现了IDisposable或其他许多原因。一般你不应该在乎为什么。它实际上是容器的实现细节。

您可以通过使用需要它的生活方式启用跟踪,但我不会看到这有助于解决您的问题。

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