温莎跟踪我的瞬态物体

时间:2012-09-10 20:51:00

标签: dependency-injection castle-windsor idisposable

我确实有一个架构问题(除此之外我对Castle Windsor不太熟悉,它用作我应用程序的容器)。

我有一个实现工作单元设计模式的Web应用程序。 UnitOfWork 实现 IDisposable 接口。

我认为在 UnitOfWork Dispose 方法中完成的操作没有特别的原因(这些操作已经在早些时候完成了)。

此外,我的所有组件都使用 transient 生命周期进行实例化。

几乎任何组件也使用存储库实例,该实例也是暂时的,并且还实现 IDisposable (并且再次,没有特别的原因)。

大多数桌面应用程序也使用这些组件。

我遇到的问题是由于实现 IDisposable 的瞬态组件导致内存泄漏,我在此处阅读:http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-underlying-mechanics/

我还注意到 Dispose 从未调用任何方式,既不是来自Web应用程序也不是来自客户端(并且实际上发现了更多帖子,当发布时会调用它们被称为组件)。

修复内存泄漏问题(并且不使用 NoTrackReleasePolicy !)的一个选项是实际删除 IDisposable 的实现。 但我想这类似于指定NoTrackReleasePolicy,这可能导致比内存泄漏更大的问题(虽然我不知道怎么做?) - 所以这是我的第一个问题。

我也尝试过指定 PerWebRequest 而不是 Transient ,但在这种情况下桌面应用程序的组件行为如何,因为没有web请求\ context ?这是我的第二个问题。

我不想考虑的另一件事是为我解决的每个组件手动调用release ...

任何以最安全\更优雅的方式解决问题的想法都会受到更多的改变......

1 个答案:

答案 0 :(得分:5)

你应该采取几个步骤。

  1. 停止你正在做的事情

  2. learn about the tools you're trying to use, especially the part about lifestyles

  3. Make sure you're understanding why Windsor is tracking the components

  4. Make sure you're understanding why tracking is important and NoTrackingReleasePolicy is a Bad Idea™

  5. 确保您了解工作单位的运作方式。

  6. 现在您已经了解了一些基础知识,如果您正在寻找灵感来解决这个问题,请参阅this tutorial,了解如何在网络上实施与Windsor的UoW。

    在桌面上,它更复杂,并且依赖于场景,只是确保您不会尝试在两个应用之间重复使用注册码。