【问题标题】:linq to sql datacontext for a web application用于 Web 应用程序的 linq to sql 数据上下文
【发布时间】:2010-03-20 04:42:13
【问题描述】:

我正在尝试将 linq to sql 用于我的项目(截止日期非常短),但我有点束手无策。我不知道为每个请求线程提供方便的数据上下文的最佳方法。

我想要一个类似于单例类的东西,我的所有存储库类都可以从中访问当前数据上下文。但是,单例类是静态的,不是线程安全的,因此不适合 Web 应用程序。我想要在请求开始时创建数据上下文并将其与请求一起处理的东西。

谁能分享他们对这个问题的解决方案?我一直在寻找解决方案,我发现了 Rick Strahl 的一篇好帖子:http://www.west-wind.com/weblog/posts/246222.aspx,但我并不完全理解他的线程安全或业务对象方法。如果有人有他的线程安全方法的简化版本,我很乐意看看。

【问题讨论】:

    标签: asp.net linq-to-sql datacontext


    【解决方案1】:

    在 Global.asax 的 BeginRequest 事件中,您可以将其存储在 HttpContext.Current.Items 中,这有点像单个请求的“会话状态”。每个请求都有自己的上下文,因此如果您为每个请求存储一个新的 DataContext,则不会出现线程问题。

    你可以在 EndRequest 事件中释放它。

    http://msdn.microsoft.com/en-us/library/system.web.httpcontext.items.aspx

    但是,如果您要在每个请求上创建 DataContext,即使它没有被使用,这也不会很好地扩展。相反,您可以创建一个进行延迟初始化的静态方法。

    (抱歉,在 iPhone 上输入此代码……我知道……)

    private static MyDataContext GetDataContext() {
        var dc = HttpContext.Current.Items["dc"] as MyDataContext;
        if (dc==null) {
            dc = new MyDataContext();
            HttpContext.Current.Items.Add("dc", dc);
        }
        return dc;
    }
    

    【讨论】:

    • 看起来是个不错的解决方案。但是,如果我通过引用 System.Web.HttpContext 在我的“模型/业务”层中执行此操作,这会起作用吗?
    • 我需要在 EndRequest 事件中处理 datacontext 吗?无论如何,它不会在请求结束后立即处理吗?如果是这样的话,我什至需要把它放在 global.asax 中吗?也许我可以在我的业务层中有一个单例类来创建数据上下文并将其附加到当前的 httpcontext。这行得通吗?
    • 是的,您应该在 EndRequest 事件中处理 DataContext 否则它将超出范围并需要由垃圾收集器完成。至于让您的业务层访问 HttpContext... 从技术上讲,它没有任何问题,但它确实创建了对 ASP.NET 的依赖。你可能想考虑使用 IOC 容器(这里有很多关于它的信息),它可以更容易地传递依赖关系。
    • 但不会将其添加到 global.asax 还会在我的业务/数据层和表示层之间创建依赖关系?原因是我所有访问数据上下文的存储库都位于我的业务/数据层中。
    • 顺便说一句,我发现了一个有趣的页面,其中说明了为什么处理数据上下文并不重要的原因:lee.hdgreetings.com/2008/06/linq-datacontex.html
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2011-01-09
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多