我正在尝试使用linq来为我的项目使用sql(非常短的截止日期),而且我有点陷入困境。我不知道为每个请求线程提供数据上下文的最佳方法。
我想要一个类似单例类的东西,我的所有存储库类都可以从中访问当前的数据上下文。但是,singleton类是静态的,不是线程安全的,因此不适合Web应用程序。我想要在请求开始时创建数据上下文并将其与请求一起处理。
任何人都可以分享他们对这个问题的解决方案吗?我一直在寻找解决方案,我找到了Rick Strahl的一篇好文章:http://www.west-wind.com/weblog/posts/246222.aspx但我并不完全理解他的线程安全或业务对象方法。如果某人有他的线程安全方法的简化版本,我很乐意看看。
答案 0 :(得分:0)
在Global.asax的BeginRequest事件中,您可以将其存储在HttpContext.Current.Items中,这类似于单个请求的“会话状态”。每个请求都有它自己的上下文,所以如果你为每个请求存储一个新的DataContext,就没有线程问题。
您可以将其置于EndRequest事件中。
http://msdn.microsoft.com/en-us/library/system.web.httpcontext.items.aspx
但是,如果您要在每个请求上创建DataContext,即使它没有被使用,也无法很好地扩展。相反,您可以创建一个执行延迟初始化的静态方法。
(抱歉,在iPhone上输入此代码......我知道......)
private static MyDataContext GetDataContext() {
var dc = HttpContext.Current.Items["dc"] as MyDataContext;
if (dc==null) {
dc = new MyDataContext();
HttpContext.Current.Items.Add("dc", dc);
}
return dc;
}