在Dispose()方法中做什么

时间:2018-09-25 17:58:07

标签: c# nhibernate idisposable

免责声明:我知道我对存储库的建模可能是错误的,因此我将在交付我的应用程序之前对其进行重构。但是我真正想知道的是关于Dispose(),我的怀疑之一是这个错误的实现,但是我希望我在这里得到的答案能够更好地理解我的应用程序的其他部分。

那我为什么认为我的存储库是错误的?我正在使用nhibernate,在我阅读的第一篇教程中,给出的示例在每个存储库方法(添加,查找,findall等)中都使用了“ using”关键字。当我开始需要延迟加载时,便出现了问题,因此在搜索中,我偶然发现了Ayende在MSDN杂志上的有关将nhibernate用于桌面应用程序的文章,而这正是我的情况。基本上相关的一点是,Session应该由演示者(表单?)控制,而不是由存储库负责。所以我基本上和他说的相反,因为某种原因(我真的不记得了),当时我不想在域项目(其中包含我的nhibernate存储库)和nhibernate中都引用nhibernate。 UI项目。也许是因为我不想将UI与基础架构联系在一起……总之,我离题了。

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

例如,我有一个ComboBox,其中填充了通过存储库检索的“材料”实体。当用户选择一个时,我将其传递给“ EstimatesCalculator”的方法GetPricesPerMaterial(Material x),该方法在其构造函数中需要一些存储库,并通过Wich称为它的形式传递给它。因此,我的存储库是IDisposable的,因为Session是IDisposable的。我在存储库Dispose()中调用Session.Dispose()。

现在,问题是:仅仅因为服务(如“ EstimatesCalculator”)拥有对IDisposable的引用,它们是否也需要IDisposable吗?我确定我会以表格的形式处理那些引用的IDisposables,Wich创建并将它们传递给服务,因此我认为我不需要在服务中调用Repository.Dispose(),但是我是否需要设置那些对null或其他东西的引用?

1 个答案:

答案 0 :(得分:-1)

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

无论确保您处置该资源。听起来您的表单正在拥有会话。您只需将其丢弃。

另请参阅:IDisposable Interface

相关问题