在mvc3控制器上实现Idisposable

时间:2011-08-20 20:13:49

标签: asp.net-mvc-3 controller dispose

我有一个实例化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()?

2 个答案:

答案 0 :(得分:2)

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

在执行此操作时,您将创建一个不依赖于数据库的控制器。术语瘦的控制器,脂肪模型适用于此。服务层将在此实例中充当模型。您还可以将服务层和控制器(如果需要)单独测试彼此隔离

答案 1 :(得分:2)

你没有做错任何事。你得到了推荐,因为你在你的类(cotnroller)中保存了一些实现IDisposable的字段。该框架将调用“重载”-version,因此只需将所有代码移到那里。

Details on MSDN

BTW你不会看到console-writeline - 而是使用System.Diagnostic.Debug.WriteLine