1

我正在涉足 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 做足够的工作来知道我应该在哪里处理这个问题。

4

1 回答 1

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();
    }
}
于 2013-08-14T15:38:14.653 回答