将我的DataContext存储在会话内存中是个好主意吗?

时间:2012-11-05 11:20:11

标签: c# asp.net

我正在编写一个非常简单的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不想用你的键盘来打你?

2 个答案:

答案 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