3

我正在编写一个非常简单的 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内存,并在所有 UserControls 等中引用,然后在 PreRender 阶段将其处理掉。

所以这是我的问题,这是一个坏主意吗?我想这将涉及到数据库的一些悬空连接,因为异常或调试会停止 PreRender 运行。也许检查 MasterPage 的 Load 以查看该会话变量中是否有任何内容并处理它,如果有的话,会对它进行排序。

或者有没有一种更聪明的方法可以在整个页面生命周期中共享 DataContext 而您的 DBA 不想用键盘敲击您?

4

2 回答 2

4

Session 很可能不是一个好主意——您必须担心并发性、恢复断开的连接等。此外,在 PreRender 中处理上下文的方法也不是最好的,因为在发生异常的情况下 PreRender 处理程序将永远不会执行。

System.Web.HttpContext.Current.Items是 ASP.NET 中唯一仅在单个请求期间处于活动状态的存储,并且在执行过程中在不同线程之间传输 ASP.NET 请求时在极少数情况下进行处理。

您可以使用Application_EndRequestglobal.asax 中的事件来始终正确地处理您的连接(EndRequest 在错误之后也被调用)。

于 2012-11-05T11:36:10.027 回答
3

在 ASP.NET 中,最好的办法是使用依赖注入框架为每个请求创建一次。

参见例如https://github.com/ninject/Ninject.Web.Common/wiki/Inrequestscope

于 2012-11-05T11:25:56.337 回答