我正在编写一个非常简单的ASP.net项目。它使用Linq2Sql DataContext来访问存储过程。有一个IDisposable类在它的构造函数中创建一个新的DataContext并将其置于它的dispose中。
我尽可能将请求组合在一起:
using(var dc = new MyDataAccessClass())
{
//All the data requests in here
}
// Do stuff with the data here
所以在整个代码中有很多这些主要是在UserControls中,我只是在考虑在起始页面(或主页面)的PageLoad中创建单个DataAccess类是否有意义,存储它在Session Memory中,并在所有UserControls和whatnot中引用,然后在PreRender阶段处理它。
所以这是我的问题,这是一个坏主意吗?我想这会涉及到数据库的一些悬空连接,因为异常或调试会阻止PreRender运行。 也许检查MasterPage的Load以查看该会话变量中是否有任何内容并且如果是,则对其进行处理,将对其进行排序。
或者有没有更聪明的方法在整个页面生命周期内共享DataContext,而DBA不想用你的键盘来打你?
答案 0 :(得分:4)
会话很可能不是一个好主意 - 您必须担心并发性,恢复断开的连接等。此外,在PreRender中处理上下文的方法并不是最好的,因为在异常的情况下,PreRender处理程序永远不会执行。
System.Web.HttpContext.Current.Items
是ASP.NET中唯一仅在单个请求期间处于活动状态的存储,并且在极少数情况下处理ASP.NET请求在中间的不同线程之间传输时处理执行。
您可以在global.asax中使用Application_EndRequest
事件来正确处理您的连接(在错误之后也会调用EndRequest)。
答案 1 :(得分:3)
在ASP.NET中,最好的办法是使用依赖注入框架为每个请求创建一次。
参见例如https://github.com/ninject/Ninject.Web.Common/wiki/Inrequestscope