C# 如果您的ViewModel是IDisposable的,MVC会调用Dispose吗?

C# 如果您的ViewModel是IDisposable的,MVC会调用Dispose吗?,c#,.net,asp.net-mvc,idisposable,C#,.net,Asp.net Mvc,Idisposable,假设您无法控制对象的创建和处理。在某些情况下,你不会 以MVC为例。假设你有这样的东西: interface IFoo : IDisposable { } class HomeController { private IFoo _foo = null; HomeController(IFoo foo) { _foo = foo; } ActionResult Index() { return View(_foo

假设您无法控制对象的创建和处理。在某些情况下,你不会

以MVC为例。假设你有这样的东西:

interface IFoo : IDisposable { }

class HomeController
{
    private IFoo _foo = null;

    HomeController(IFoo foo)
    {
        _foo = foo;
    }

    ActionResult Index()
    {
        return View(_foo);
    }
}
一旦您的对象被传递到视图,您就几乎失去了对它的控制

在这种情况下,我只能想到两种方法来缓解这种情况:

1) 如果疼,就不要做。换句话说,不要让您提供给视图的内容成为可识别的

2) 或者,与1相同,但是如果您确实收到了一个
IDisposable
,并且希望将其传递给视图,则不要这样传递
IDisposable
。即使涉及到所有数据的副本,也可以将其强制转换为不可
IDisposable
的内容,并自己调用
Dispose()
。例如,像这样:

ActionResult Index()
{
    using(_foo)
    {
      return View((FooViewModel)_foo);
    }
}

但我很好奇。MVC是否检查IDisposable,并在完成视图渲染后,在视图接收到的任何状态下调用它?

因此,这里有几点。简短回答:不,MVC不会对存储在字段中的视图模型调用Dispose

更长的回答:根据您在此处列出的内容,可能是

我假设您正在使用某种依赖注入框架,如autofac、structuremap等,那么容器将跟踪该实例。我不知道每个框架的复杂性,但我假设它们中的许多确实在请求结束时对实现
IDisposable
的类型调用dispose(autofac肯定会这样做)


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

ASP.NET MVC
控制器
类已经实现了
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();
    } 
}

非常感谢。对我希望和Unity一起去。我知道有一个ContainerLifeTimeManager或类似的对象控制对象的生命周期,但我不知道具体细节。所以,我想你的答案是正确的。在我标记之前6分钟。您的模型不会自动被丢弃,但在原始答案中,您可以通过覆盖控制器的
Dispose()
方法来清理。对不起,@Darren。你的回答非常正确,非常有帮助,并且开辟了另一个话题。但我现在倾向于投票支持贾斯汀的答案,因为这是一个非常棒的话题。哦,当然。现在你只是让你所有的朋友来投票支持你-走开,贾斯汀,这是我的问题p:-)还有4分钟!顺便说一句,justin是正确的,因为您可以在每个控制器中手动执行此操作,但我仍然建议让您的ioc框架执行此操作(出于各种原因)。无论哪种方法都能完成任务,所以选择最适合你的方法。@DarrenKopp。这真是你们两个之间的一条纽带。我很感激这两个答案。我非常喜欢他们两个,我希望两个都能做到。唉!:-)我同意@DarrenKopp,因为
HomeController
没有专用的\u foo,但是\u foo是使用构造函数注入的。这意味着实例(_foo)可以在其他实例中使用。所以我认为HomeController不应该处理。。。