加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 将linq连接到sql datacontext到业务层中的httpcontex

发布时间:2020-12-15 20:55:47 所属栏目:asp.Net 来源:网络整理
导读:我需要我的 linq to sql datacontext在我的业务/数据层可用,以便我的所有存储库对象都可以访问.但是,由于这是一个Web应用程序,我想根据请求创建并销毁它.我想知道是否有一个可以懒惰创建并将datacontext附加到当前HttpContext的单例类可以工作.我的问题是:
我需要我的 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;
        }
    }
}

解决方法

你想象的是有意义的 – 使用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; 
        } 
    }
}

我认为应该这样做. ASPNET不会自动为您执行此操作.当然,在真实应用程序中使用此代码之前,您需要保护免受异常等的影响.

Vertigo的Keith Craig写了a relevant post on the topic a while ago,描述了你想要做什么作为一种模式,换句话说,一种做一些应该重复的事情.他提供了一个类来帮助解决这个问题,延迟加载DB上下文并将其放入当前上下文中.这种方法存在一些缺陷 – 您可以在该帖子的评论讨论中阅读它们.评论中还引用了一堆相关文章.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读