asp.net-mvc - 如何在我的项目中实现一个健壮的每请求 session 模式,同时专注于信息隐藏?

标签 asp.net-mvc nhibernate session information-hiding

我目前正在构建一个 ASP.NET MVC 项目,其中 NHibernate 作为其持久层。

目前,已经实现了一些功能,但只使用本地 NHibernate session :访问数据库(读取或写入)的每个方法都需要使用“using()”子句实例化自己的 NHibernate session 。

问题是我想利用 NHibernate 的延迟加载功能来提高我的项目的性能。

这意味着在呈现 View 之前,每个请求都有一个打开的 NHibernate session 。此外,必须支持同时请求(同时多个 session )。

我怎样才能尽可能干净地做到这一点?

我在网上搜索了一下,了解了 session-per-request 模式。我看到的大多数实现都使用某种 Http*(HttpContext 等)对象来存储 session 。此外,使用 Application_BeginRequest/Application_EndRequest 函数很复杂,因为当我只想为每个请求实例化一次 session 时,它们会为每个 HTTP 请求(aspx 文件、css 文件、js 文件等)触发。

我担心的是我不希望我的 View 或 Controller 能够访问 NHibernate session (或者,更一般地说,NHibernate 命名空间和代码)。这意味着我不想在 Controller 级别或 View 级别处理 session 。

我有几个选择。哪一个看起来最好?

  • 使用在 Controller 操作之前和之后触发的拦截器(如在 GRAILS 中)。这些将打开和关闭 session /交易。这在 ASP.NET MVC 世界中可能吗?
  • 在 Web 上下文中使用 NHibernate 提供的 CurrentSessionContext Singleton。使用 this page例如,我认为这是很有希望的,但这仍然需要 Controller 级别的过滤器。
  • 使用 HttpContext.Current.Items 存储请求 session 。再加上 Global.asax.cs 中的几行代码,可以轻松地为我提供请求级别的 session 。但是,这意味着将在 NHibernate 和我的 View (HttpContext)之间注入(inject)依赖关系。

  • 非常感谢你!

    最佳答案

    好吧,伙计们,经过几天的工作,我终于决定使用 HttpContext.Current.Items 来加载 session 。

    效果很好!

    我是这样做的

    import System.Web
    class SessionManager {
        public static ISession GetSession()
            var session = HttpContext.Current.Items["NHibernateSession"];
            if (session == null) {
                session = ...; // Create session, like SessionFactory.createSession()...
                HttpContext.Current.Items.Add("NHibernateSession", session);
            }
            return session;
        }
    
        public static void CloseSession()
        {
            var session = HttpContext.Current.Items["NHibernateSession"];
            if (session != null) {
                if (session.IsOpen) {
                    session.close();
                }
                HttpContext.Current.Items.Remove("NHibernateSession");
            }
        }
    }
    

    通过使用此类提供的静态方法,可以获得与当前 HttpContext(当前 Web 请求)相关联的 session (例如,在 Controller 中)。我们需要另一段代码在请求完成时调用 CloseSession() 方法。

    在 Global.asax.cs 中:
    protected void Application_EndRequest(object sender, EventArgs args)
    {
        NHibernateSessionManager.CloseSession();
    }
    

    session 完成时会自动调用 Application_EndRequest 事件,因此可以正确关闭和处理 session 。这很有用,因为否则我们将不得不在每个 Controller 中执行此操作!

    关于asp.net-mvc - 如何在我的项目中实现一个健壮的每请求 session 模式,同时专注于信息隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046168/

    相关文章:

    asp.net-mvc - JSONIgnore 类上的数据注释

    asp.net-mvc - Excel 不想打开通过 ASP 输出下载的 XLSX 文件

    asp.net-mvc - 忍者不开火?

    nhibernate - NHibernate 中的 Configuration.GenerateSchemaUpdateScript() 是管理数据库架构更改的好方法吗

    php - 通过 id 检查 session 是否存在,而不更新 session 的生命周期

    java - 存储在应用程序 session 中的集合变为空

    asp.net-mvc - 单元测试 Asp.net MVC Controller 操作

    c# - 当我向其中添加一项时,为什么 NHibernate 会删除并重新创建集合中的所有关联?

    nhibernate - 使用 NHibernate/Fluent Nhibernate 强制插入身份

    Java servlet, session : null session gets created, 无法使其失效