将linq连接到sql datacontext到业务层中的httpcontext

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)

Che*_*eso 8

你想象的是有意义的 - 使用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上下文并将其放入当前上下文中.这种方法存在一些缺陷 - 您可以在该帖子的评论讨论中阅读它们.评论中还引用了一堆相关文章.