代码之家  ›  专栏  ›  技术社区  ›  Claudio Cauchi

Castle Windsor IoC-Singleton/Transient引用内存泄漏

  •  0
  • Claudio Cauchi  · 技术社区  · 8 年前

    我有一个WPF应用程序,它使用IOC和带有构造函数注入的根组合模式。视图模型构造函数中的大多数参数都是存储库。一些存储库正在使用单例生活方式,因为它们正在缓存内容。所有视图模型都是瞬态的,因为我希望在视图关闭后立即释放内存。

    然而,在瞬态视图模型中引用单例存储库是在它们不再使用后将它们全部保存在内存中,从而阻止IOC容器释放它们。

    当不再使用这些类时,有没有一种模式可以遵循?我想在ViewModels上实现IDisposable,并将存储库引用设置为null,但这听起来不太正确。

    1 回复  |  直到 8 年前
        1
  •  3
  •   diegog    8 年前

    根据一位提交人的博客 Castle Project :

    Must I release everything when using Windsor?

    瞬态组件类似于池,因为瞬态组件的寿命没有众所周知的结束时间,除非您明确告知(通过调用Release),否则Windsor不会知道您是否仍要使用组件。由于瞬态组件按定义是非共享组件,因此当您释放组件时,Windsor将立即销毁该组件。

    根据他的另一篇帖子:

    Must Windsor track my components?

    默认情况下,Windsor将跟踪自身存在任何退役问题、被合并或其任何依赖项被跟踪的对象。


    现在,人们经常认真地看到,Windsor将其创建的组件视为内存泄漏(通常是,当使用不当时,我将在下一篇文章中讨论),并且他们会继续使用Windsor保持对象导致内存泄漏,所以让我们使用NoTrackingReleasePolicy,问题就解决了。

    因此,我们可以说,Windsor几乎总是会保留对瞬态对象和池对象的引用,除非您明确释放它们。

    解决这个问题的一个好办法是编写一个定制的LifestyleManager,在应用程序不再需要视图模型时发布它们。