我需要我的linq to sql datacontext在我的业务/数据层中可用,以供我的所有存储库对象访问。但是,由于这是一个web应用程序,我想创建和销毁它的每个请求。我想知道,如果有一个单独的类,可以懒惰地创建数据上下文并将其附加到当前的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;
        }
    }
}发布于 2010-03-22 19:15:34
你的想象是有意义的--使用超文本传输协议请求上下文来存储东西--但是不,当请求结束时,存储在当前HttpContext中的可处理对象不会自动被释放。你将不得不以某种方式自己处理它。
有一个"End Request“事件,您可以很容易地将其挂钩,例如使用放入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; 
        } 
    }
}我想应该是这样的。ASPNET不会自动为您执行此操作。当然,在真正的应用程序中使用此代码之前,您需要防止异常等问题。
Vertigo的Keith Craig写了a relevant post on the topic a while ago,将你想要做的事情描述为一种模式,换句话说,一种做应该重复的事情的方式。他提供了一个类来帮助解决这个问题,即延迟加载DB上下文并将其放入当前上下文中。这种方法有一些陷阱-你可以在那篇文章的评论讨论中了解到它们。此外,评论中还引用了一堆相关文章。
发布于 2013-06-02 07:58:55
Cheeso的代码将生成一个InvalidOperationException "Collection was modified; enumeration operation may not execute",因为它试图修改它正在迭代的HttpContext项。
您可以使用列表的副本来防止这种情况发生。
protected void Application_EndRequest(Object sender, EventArgs e)
{
    var keys = new ArrayList(HttpContext.Current.Items.Keys);
    foreach (var key in keys)
    {
        var disposable = HttpContext.Current.Items[key] as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
            HttpContext.Current.Items[key] = null;
        }
    }
}https://stackoverflow.com/questions/2482220
复制相似问题