- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在构建一个 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 。
我有几个选择。哪一个看起来最好?
最佳答案
好吧,伙计们,经过几天的工作,我终于决定使用 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");
}
}
}
protected void Application_EndRequest(object sender, EventArgs args)
{
NHibernateSessionManager.CloseSession();
}
关于asp.net-mvc - 如何在我的项目中实现一个健壮的每请求 session 模式,同时专注于信息隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046168/
我是一名优秀的程序员,十分优秀!