如果你的ViewModel是IDisposable, MVC会调用Dispose吗?
本文关键字:调用 Dispose MVC ViewModel IDisposable 如果 | 更新日期: 2023-09-27 18:05:23
假设您无法控制对象的创建和处置。在某些情况下,你不需要。
以MVC为例。假设您有这样的内容:
interface IFoo : IDisposable { }
class HomeController
{
private IFoo _foo = null;
HomeController(IFoo foo)
{
_foo = foo;
}
ActionResult Index()
{
return View(_foo);
}
}
一旦你的对象被传递给View,你几乎就失去了对它的控制。
在这种情况下,我只能想到两种方法来缓解这种情况:
如果疼痛,就不要做。换句话说,不要让你给你的观点的是IDisposable
。
2)或者,与1相同,但如果您确实接收到IDisposable
并且希望将其传递给视图,则不要传递IDisposable
。转换,即使它涉及到所有数据的副本,到不是IDisposable
的东西,并自己调用Dispose()
。例如:
ActionResult Index()
{
using(_foo)
{
return View((FooViewModel)_foo);
}
}
但是我很好奇。MVC检查IDisposable
和调用它在任何状态收到的视图一旦完成渲染视图?
. NET MVC Controller
类已经实现了IDisposable
。如果需要在请求执行之后进行进一步的清理,可以覆盖Dispose
方法。在您的示例中,它看起来像:
public class HomeController
{
private IFoo _foo = null;
// Your code as usual
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if(disposing && _foo != null)
_foo.Dispose();
}
}
这里有一些东西。简短的回答:不,MVC不会调用Dispose在你的视图模型,存储在一个字段。
较长的答案:从你在这里列出的,可能是。
我假设你正在使用某种依赖注入框架,如autofac, structuremap等,那么容器将跟踪该实例。我不知道每个框架的复杂性,但我假设他们中的许多人实际上在请求结束时对实现IDisposable
的类型调用dispose (autofacc肯定会这样做)。