我正在涉足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知道我应该在哪里处理它。
答案 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();
}
}