【问题标题】:How to Properly dispose an object without IDisposable如何在没有 IDisposable 的情况下正确处置对象
【发布时间】:2018-04-08 13:44:35
【问题描述】:

在我的 ASP.NET MVC 应用程序中,我有一个这样的控制器:

[HttpPost]
public ActionResult CreateTestCategory(TestCategory testCategory)
{
    BLL.Admin.CreateTestCategory obj = new BLL.Admin.CreateTestCategory();
    obj.Create(testCategory.TestCategoryName);
    //((IDisposable)obj).Dispose();

    return RedirectToAction("TestCategory", "Admin");
}  

这里的BLL.Admin.CreateTestCategory 在另一层,它没有实现 IDisposable。它只是进行一些 EF 数据库调用,这些调用使用存储库模式以自己的方式处理,所以不用担心。但是在这个控制器中,我创建了该类的对象obj。解决后,我想手动销毁/处置 obj。所以我注释掉的那一行,这是处理obj的唯一方法吗?

我没有让BLL.Admin.CreateTestCategory 实现IDisposable 的原因是,可能有一百个这样的类。我不想去每一个都实现 IDisposable 然后使用 using 块,这很痛苦,相反我想在创建它之后手动处理它。我也不想等待GC。那么什么是完美可靠的方法呢?

【问题讨论】:

  • 假设你决定为那个类实现IDisposable(你不想,但假设你尝试过),你会在Dispose()实现中写什么?
  • 鉴于@Evk 的评论,也许您可​​以在destructor 上实现它。
  • 如果您没有任何东西要处理,那么让 GC 来完成它的工作。只需确保所有 repositorys 和 unit of works 都在释放托管资源。
  • 您不能只从实例化的 .NET 对象中回收内存,只有 GC 可以做到这一点。实现IDisposable 和调用Dispose 也不会这样做。所以你应该让它保持原样,让 GC 完成它的工作。
  • 附带说明,将类命名为动作动词并不是一个好习惯。这是因为它们听起来像一种方法,即CreateTestCategory 听起来像一种方法。最好将它们命名为名词,这样它们听起来就像一个对象。因此,更好的名称是 TestCategoryCreator 或 TestCategoryService 或 TestCategoryManager。

标签: c# asp.net-mvc


【解决方案1】:

这个问题已经在问题本身的 cmets 中以迂回的方式回答了,但是总结一下 CodingYoshi、Evk 和 Fabjan 在那里所说的话......

IDisposable 用于清理不由 .NET 运行时管理的资源。如果您需要清理与数据库的连接、文件锁等,那么您真的应该使用IDisposable。对于托管内存,垃圾收集器在几乎任何情况下都会比您更好地处理它。可以使用析构函数,但通常不是必需的。

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2014-04-04
    • 2014-10-02
    • 2013-06-08
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多