请求完成时清理数据库连接

时间:2013-08-14 13:56:57

标签: asp.net-mvc-3

我正在涉足MVC3,而且我正在组建一个连接到SQL Server的站点(在那里没什么大惊喜,我敢肯定)。我正在使用一个名为SqlRepository的基类,它将被不同业务对象的各种其他存储库类扩展。基类将处理打开数据库连接,该连接将在请求的生命周期内在所有其他实例之间共享(换句话说,单例)。它看起来像这样:

public abstract class SqlRepository {
    protected SqlConnection dbconn;

    public SqlRepository() {
        if (HttpContext.Current.Items["dbconn"] == null) {
            dbconn = new SqlConnection(WebConfigurationManager.ConnectionStrings["SqlRepositoryConnection"].ConnectionString);
            dbconn.Open();
            HttpContext.Current.Items["dbconn"] = dbconn;
        } else {
            dbconn = (SqlConnection)HttpContext.Current.Items["dbconn"];
        }
    }
}

子类将为不同的存储库类型实现各种接口,并将通过Ninject注入。

那么,确保在每个请求生命周期结束时关闭数据库连接的好方法是什么?我想这样做没有很多额外的依赖,而且不需要从控制器中显式关闭连接(因为我将为其他虚拟存储库提供不同的构建配置,甚至可能不使用基于SQL的存储库在开发/调试前端时。)

我怀疑有一个简单的解决方案,但我还没有做足够的MVC3知道我应该在哪里处理它。

1 个答案:

答案 0 :(得分:2)

如果您不想在控制器或控制器基类中执行此操作,请在Global.asax中执行此操作。不是MVC方式,而是'因为你使用MVC并不意味着一切都必须是纯MVC。这些事件仍然可以正常运作:

private void Application_EndRequest(object sender, EventArgs e)
{
    var conn = HttpContext.Current.Items["dbconn"];
    if (conn != null)
    {
        conn.Close();
    }
}