首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将linq to sql datacontext附加到业务层中的httpcontext

将linq to sql datacontext附加到业务层中的httpcontext
EN

Stack Overflow用户
提问于 2010-03-20 14:47:21
回答 2查看 2.5K关注 0票数 7

我需要我的linq to sql datacontext在我的业务/数据层中可用,以供我的所有存储库对象访问。但是,由于这是一个web应用程序,我想创建和销毁它的每个请求。我想知道,如果有一个单独的类,可以懒惰地创建数据上下文并将其附加到当前的HttpContext,是否可以工作。我的问题是:当请求结束时,datacontext会自动处理吗?下面是我所想的代码。这是否能实现我的目标:拥有一个线程安全的datacontext实例,该实例可以延迟使用,并在请求结束时自动释放?

代码语言:javascript
运行
复制
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;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-22 19:15:34

你的想象是有意义的--使用超文本传输协议请求上下文来存储东西--但是不,当请求结束时,存储在当前HttpContext中的可处理对象不会自动被释放。你将不得不以某种方式自己处理它。

有一个"End Request“事件,您可以很容易地将其挂钩,例如使用放入Global.asax.cs中的代码。在Application_EndRequest()方法中,可以对列表中需要Dispose()的每个对象手动调用它。

一种方法是遍历上下文中的每一项,测试IDisposable,然后调用Dispose。

代码语言:javascript
运行
复制
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上下文并将其放入当前上下文中。这种方法有一些陷阱-你可以在那篇文章的评论讨论中了解到它们。此外,评论中还引用了一堆相关文章。

票数 9
EN

Stack Overflow用户

发布于 2013-06-02 07:58:55

Cheeso的代码将生成一个InvalidOperationException "Collection was modified; enumeration operation may not execute",因为它试图修改它正在迭代的HttpContext项。

您可以使用列表的副本来防止这种情况发生。

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2482220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档