【问题标题】:Castle Windsor IoC - Memory leaks with Singleton/Transient referencesCastle Windsor IoC - 带有单例/瞬态引用的内存泄漏
【发布时间】:2016-10-18 23:16:19
【问题描述】:

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

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

有没有一种模式可以在不再使用时释放这些类?我正在考虑在 ViewModel 上实现 IDisposable 并将存储库引用设置为 null,但这听起来不对。

【问题讨论】:

  • 引用单例的瞬态很好。这不会导致您的问题。为了避免内存泄漏,您应该为每个 Resolve() 设置一个匹配的 Release()。
  • 同意。我连接到视图的关闭事件并释放了我之前正在解析的实例。

标签: c# wpf castle-windsor ioc-container


【解决方案1】:

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

Must I release everything when using Windsor?

瞬态组件类似于池化,因为瞬态组件的生命周期没有众所周知的终点,而且 Windsor 不会知道您是否仍要使用组件,除非您明确告诉它(通过调用 Release)。由于瞬态组件根据定义是非共享组件,因此当您发布组件时,Windsor 会立即销毁该组件。

根据他的另一个帖子:

Must Windsor track my components?

默认情况下,Windsor 将跟踪本身有任何退役问题、被池化或跟踪其任何依赖项的对象。


现在说真的 - 人们经常看到 Windsor 将它创建的组件视为内存泄漏(通常是,当使用不当时,我将在下一篇文章中讨论),然后他们去了 - Windsor 坚持对象会导致内存泄漏,所以让我们使用 NoTrackingReleasePolicy,问题就解决了。

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

一个优雅的解决您的问题的方法是编写一个自定义 LifestyleManager 以在您的应用程序不再需要它们时释放您的视图模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2011-05-01
    • 2021-08-11
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多