如果你的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和调用它在任何状态收到的视图一旦完成渲染视图?

如果你的ViewModel是IDisposable, MVC会调用Dispose吗?

. 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肯定会这样做)。

最后,您只需要测试它是否为,然后从那里开始。