在 Dispose() 方法中做什么

What to do in Dispose() method

免责声明:我知道我对存储库的建模可能完全错误,我会在发布我的应用程序之前对其进行重构。但我真正想知道的是关于 Dispose() 的问题,我的疑虑之一是这个不正确的实现,但我希望我在这里得到的答案将有助于我的应用程序的其他部分更好地理解该方法。

那么为什么我认为我的存储库是错误的?我正在使用 nhibernate,从我阅读的第一篇教程中,给出的示例是在每个存储库方法(add、find、findall 等)中使用 "using" 关键字。当我开始需要延迟加载时,问题就出现了,所以在我的搜索中,我偶然发现了 Ayende 在 MSDN 杂志上关于将 nhibernate 用于桌面应用程序的文章,这正是我的情况。基本上相关的一点是 Session 应该由演示者(表单?)控制,而不是存储库的责任。所以我基本上做了与他所说相反的事情,因为出于某种原因(我真的不记得了)我当时不想在域项目(包含我的 nhibernate 存储库)和UI 项目。可能是因为我不想将 UI 与基础设施捆绑在一起......无论如何,我离题了。

要点是:我的存储库使会话保持打开状态,直到我不需要它们为止。当我需要一些需要存储库的域服务时,我会从表单中传递一个。但只是因为该存储库包含我在服务请求期间需要维护的会话。

例如,我有一个 ComboBox,其中填充了通过存储库检索到的 "Materials" 个实体。当用户选择一个时,我将它传递给 "EstimatesCalculator" 的方法 GetPricesPerMaterial(Material x),它的构造函数中需要一些存储库,通过调用它的表单传递给它。所以,我的存储库是 IDisposable,因为 Session 是 IDisposable。我在我的存储库 Dispose() 中调用 Session.Dispose()。

现在,问题是:仅仅因为服务(如 "EstimatesCalculator")持有对 IDisposable 的引用,它们是否也需要是 IDisposable?我确定我会在表单中处理那些引用的 IDisposables,创建并将它们传递给服务,所以我认为我不需要在服务中调用 Repository.Dispose(),但是我需要吗? ,将这些引用设置为 null 或其他内容?

如果仅与非托管资源有关联(例如 NHibernate 会话中包含的 ADO.NET 连接),则不要实现 IDisposable。如果您的 class 拥有 class 中的非托管资源(NHibernate 会话),请实施 IDisposable。还有其他情况也可以实现 IDisposable。它们在 Dispose Pattern link.

中被引用

无论如何,请确保您处置了该资源。听起来您的表单正在拥有会话。你应该把它扔在那里。

另见:IDisposable Interface