【发布时间】:2014-04-22 09:34:37
【问题描述】:
场景:我有一个在其默认构造函数中订阅静态事件的类。因此,该类被设为IDisposable,这样它就可以取消订阅静态事件并被正确地进行垃圾收集。这个类在使用RhinoMocks 的测试中被模拟。它有复合部分子代,可能是也可能不是IDisposable。
问题:由于 Dispose 方法被 RhinoMocks 自动模拟,我正在泄漏这些对象。由于仍然订阅的对象对未正确设置的事件做出反应,这会导致不同测试中的“随机”错误。
问题:我知道 RhinoMocks 有一些方法可以说明应该调用原始方法 (CallOriginalMethod),但我注意到 RhinoMocks 有时会在我自己的声明之外创建代理。因此,我认为我不能防止这些对象被泄露。有没有办法解决这个问题?
【问题讨论】:
-
这不是
IDisposable的用途。你总是必须手动调用Dispose,所以你不能依赖它被调用。静态事件是一种可怕的模式,你应该像避免瘟疫一样避免它们。我知道这并不能真正回答您的问题,但您应该修改您的应用程序设计 - 如果您依赖静态事件,您可能会做一些非常错误的事情。至少,您应该使用自己的事件管理器,例如仅使用弱引用(如果这是您的使用模式) - 如果您发现对象已在此期间被收集,只需将其从管理器中删除。 -
我完全同意@Luaan 的观点,订阅静态事件会导致各种问题,应该避免。可悲的是,这在我加入之前几年前已经在客户的框架中实现了,并且已经成为管理应用程序事件的组成部分......我担心重构不是一种选择,因为没有人会为此付费。我研究了弱事件订阅,但没有发现任何感觉可靠或完整的东西。你知道一个很好的消息来源,我全神贯注:)
标签: c# memory-leaks rhino-mocks idisposable