【发布时间】: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