gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:48:12 25 4
gpt4 key购买 nike

我目前正在构建一个 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com