Riz*_*Riz 6 asp.net datacontext linq-to-sql
我需要我的linq to sql datacontext在我的业务/数据层可用,以便我的所有存储库对象都可以访问.但是,由于这是一个Web应用程序,我想根据请求创建并销毁它.我想知道是否有一个可以懒惰创建并将datacontext附加到当前HttpContext的单例类可以工作.我的问题是:当请求结束时,datacontext会自动处理吗?以下是我正在思考的代码.这是否达到了我的目的:拥有一个可以延迟使用的线程安全的datacontext实例,并在请求结束时自动处理?
public class SingletonDC
{
public static NorthwindDataContext Default
{
get
{
NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"];
if (defaultInstance == null)
{
defaultInstance = new NorthwindDataContext();
System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance);
}
return defaultInstance;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你想象的是有意义的 - 使用HTTP Request上下文存储东西 - 但是,当请求结束时,存储在当前HttpContext中的一次性对象不会自动神奇地被处理掉.你不得不以某种方式自己解决这个问题.
有一个"结束请求"事件,您可以轻松地挂钩,例如使用您放入Global.asax.cs的代码.在Application_EndRequest()方法中,您可以Dispose()手动调用列表中需要它的每个对象.
一种方法是迭代上下文中的每个项目,测试IDisposable,然后在适当时调用Dispose.
protected void Application_EndRequest(Object sender, EventArgs e)
{
foreach (var key in HttpContext.Current.Items.Keys)
{
var disposable = HttpContext.Current.Items[key] as IDisposable;
if (disposable != null)
{
disposable.Dispose();
HttpContext.Current.Items[key] = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为应该这样做.ASPNET不会自动为您执行此操作.当然,在真实应用程序中使用此代码之前,您需要保护免受异常等的影响.
Vertigo的Keith Craig 不久前写了一篇关于这个主题的相关文章,描述了你想要做什么作为一种模式,换句话说,是一种应该重复的事情.他提供了一个类来帮助解决这个问题,延迟加载DB上下文并将其放入当前上下文中.这种方法存在一些缺陷 - 您可以在该帖子的评论讨论中阅读它们.评论中还引用了一堆相关文章.