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

水冷却器v2

假设您无法控制对象的创建和处置。在某些情况下您不这样做。

以MVC为例。假设您有这样的事情:

interface IFoo : IDisposable { }

class HomeController
{
    private IFoo _foo = null;

    HomeController(IFoo foo)
    {
        _foo = foo;
    }

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

将对象传递给视图后,您几乎会失去对它的控制。

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

1)如果很痛,请不要这样做。换句话说,不要让您提供的观点成为IDisposable事实。

2)或与1相同,但是如果您确实收到,IDisposable并且想要将其传递给视图,则不要传递IDisposable即使涉及所有数据的副本,也可以将其强制转换为不IDisposable属于Dispose()自己的东西,然后自称例如:

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

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

贾斯汀·尼斯纳(Justin Niessner)

ASP.NET MVCController类已经实现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();
    } 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果.ctor()抛出,会调用Dispose()吗?

如果您知道任务已完成,可以调用task.Result生成异步方法吗?

在Java中,如果您第二次调用相同的函数,程序会“记住”结果吗?

如果您的脚本die()s,Sys :: Syslog是否会为您调用closelog()?

“如果您编写了编译器测试,那么您已经编写了对main的调用”

如果您正在等待异步函数调用,是否需要使用Expect.assertions()?

如果您的类是从unique_ptr派生的,那么如何调用基本构造函数

如果您知道异步任务被调用了n次,请等待异步任务完成

如果您正在使用Spring Platform Bom,应该使用父项吗?

如果您拥有更多的cpu内核,Xcode会并行编译更多的Swift文件吗?

如果您移动图像或目标页面,Plone上的链接会更新吗?(4.3.4.1)

如果您处于漏洞利用的WLAN中,数据通过VPN安全吗?

如果您的用户没有该目录的权限,您仍然可以访问当前目录(或根目录)吗?

如果您只有一个KClass对象,就可以调用带有类型化参数的乐趣?

如果您已经刷新以使内容在意外重启后仍然存在,是否需要调用close?

执行智能合约时出现固体错误消息:“如果您发送值,则应支付所调用的功能...”

如果您正在使用React Testing Library / Enzyme的mount函数,它仍然是“单元测试”吗?

如果您一直在使用git merge origin / master,git reset --soft origin / master会失败吗?

如果您已经在使用stdout-stdin,可以以某种方式使用更高的文件描述符吗?

如果您只需要 SUM,那么不需要在 DAX 中创建度量,这是真的吗?

如果您知道形状的左上单元格行和列,可以直接选择形状吗

如果您递归地返回一个函数会发生什么,这是一种好习惯吗?

如果您的网站上有谷歌 AdSense,可以每 5 分钟刷新一次网站吗

Java-如果用户意外关闭程序,try-with-resources会调用.close()吗?

如果g ++是模板化的,它不会调用副本构造函数吗?

如果您从 chrome 开发工具控制台发出 http 请求,它会包含您当前所在页面的 cookie 吗?

在哪里调用在构造函数中创建的IDisposable的Dispose()?

在IDisposable.Dispose()中使用异步调用

如果您从select中获得结果,则忽略在何处的子句