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

时间:2016-06-17 07:56:09

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

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

在瞬态View Models中引用单例存储库会在不再使用它们之后将所有这些存储库保留在内存中,从而使IOC容器不会释放它们。

在不再使用时,是否有可以遵循的模式来释放类?我正在考虑在ViewModel上实现IDisposable,只是将存储库引用设置为null但它听起来并不正确。

1 个答案:

答案 0 :(得分:2)

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

Must I release everything when using Windsor?

  

瞬态组件类似于汇总,因为瞬态组件的生命周期没有众所周知的结束,并且Windsor不会知道您是否仍然想要使用组件,除非您明确告诉它(通过调用Release)。由于瞬态组件根据定义是非共享的,因此当您释放它时,Windsor会立即销毁该组件。

根据他的另一篇文章:

Must Windsor track my components?

  

默认情况下,Windsor会跟踪自己有任何解除管理问题,汇集或跟踪其任何依赖关系的对象。

  

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

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

您问题的一个优雅解决方案是编写自定义LifestyleManager,以便在您的应用程序不再需要时发布视图模型。