Asp.net mvc 3 在mvc3控制器上实现Idisposable

Asp.net mvc 3 在mvc3控制器上实现Idisposable,asp.net-mvc-3,controller,dispose,Asp.net Mvc 3,Controller,Dispose,我有一个为EF实例化数据库上下文的控制器。(我相信大多数没有实现存储库模式的人都会这么做。) 当我对我的项目运行代码分析时,它建议实现IDisposable,因此我编写了以下代码 #region Implementation of IDisposable public void Dispose() { Console.WriteLine("Dispose"); Dispose(true); GC.SuppressFinali

我有一个为EF实例化数据库上下文的控制器。(我相信大多数没有实现存储库模式的人都会这么做。)

当我对我的项目运行代码分析时,它建议实现IDisposable,因此我编写了以下代码

    #region Implementation of IDisposable
    public void Dispose()
    {
        Console.WriteLine("Dispose");
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // The bulk of the clean-up code is implemented in Dispose(bool)
    protected override void Dispose(bool disposing)
    {
        Console.WriteLine("Dispose(disposing)");
        if (disposing)
        {
            // free managed resources
            if (_dataService != null)
            {
                ((IDisposable)_dataService).Dispose();
                _dataService = null;
            }
            // free managed resources
            if (_db != null)
            {
                ((IDisposable)_db).Dispose();
                _db = null;
            }

        }
        base.Dispose(disposing);

    }
    #endregion
我也试过这样做

protected new virtual void Dispose(bool disposing)

但是我的console.writeline语句永远不会执行。我做错了什么?为什么不在我的控制器上调用Dispose()?

我个人认为,在这种情况下,最好将数据库上下文从控制器中分离出来,并将其移动到服务层。您可以使该类实现IDisposable,并将对服务层类的引用传递给控制器以使用它


在此过程中,您将创建一个不依赖于数据库的控制器。术语“瘦的控制器,胖的模型”适用于这里。服务层将在此实例中充当模型。您还可以单独测试服务层和控制器(如果您愿意的话)

我个人认为,在这种情况下,最好将数据库上下文从控制器中分离出来,并将其移动到服务层。您可以使该类实现IDisposable,并将对服务层类的引用传递给控制器以使用它


在此过程中,您将创建一个不依赖于数据库的控制器。术语“瘦的控制器,胖的模型”适用于这里。服务层将在此实例中充当模型。您还可以彼此隔离地对服务层和控制器(如果您愿意)进行单元测试

只要您没有做错任何事情。您获得推荐是因为您在实现IDisposable的类(cotnroller)中保留了一些字段。框架将调用“重载”版本,因此只需将所有代码移到其中即可


顺便说一句,您将不会看到控制台写线-使用System.Diagnostic.Debug.writeline代替

您没有做错任何事情。您获得推荐是因为您在实现IDisposable的类(cotnroller)中保留了一些字段。框架将调用“重载”版本,因此只需将所有代码移到其中即可


顺便说一句,您不会看到控制台writeline—而是使用System.Diagnostic.Debug.writeline

是的,我现在正在转换到存储库模式。测试的简单性远远超过了存储库模式中间接层的成本。测试的简单性远远超过了存储库模式中间接层的成本。Console.WriteLine在控制台上打印一些东西-在MVC应用程序中,应该没有控制台(或者更好:Console.Out应该为null/我认为不设置)-使用Debug.WriteLine,您可以始终在Debug-WindowConsole中打印某些内容。WriteLine在控制台上打印某些内容-在MVC应用程序中,应该没有控制台(或者更好:console.Out应该为null/我认为未设置)-使用Debug.WriteLine,您可以始终在Debug窗口中打印某些内容