asp.net-mvc – 如何在我的项目中实现强大的每个请求模式,同时专注于信息隐藏?
|
我正在构建一个ASP.NET MVC项目,使用NHibernate作为其持久层. 现在,已经实现了一些功能,但是仅使用本地NHibernate会话:访问数据库(读或写)的每个方法都需要使用“using()”子句实例化自己的NHibernate会话. 问题是我想利用NHibernate的延迟加载功能来改善我的项目的性能. 这意味着每个请求直到视图呈现为一个开放的NHibernate会话.此外,必须支持同时发送的请求(同时进行多个会话). 我该如何尽可能干净地实现? 我在网上搜了一下,并了解了每个请求模式的模式.我看到的大多数实现使用了一些Http *(HttpContext等)对象来存储会话.此外,使用Application_BeginRequest / Application_EndRequest函数是复杂的,因为它们每个请求都会针对每个HTTP请求(aspx文件,css文件,js文件等)触发,当我只想要每个请求实例化一次会话. 我所关心的是,我不希望我的意见或控制器能够访问NHibernate会话(或更一般地,NHibernate命名空间和代码).这意味着我不想处理控制器级别的会话或视图. 我有几个选择.哪一个似乎最好? >使用控制器操作之前和之后触发的拦截器(如GRAILS中).这些将打开和关闭会话/交易.这是可能在ASP.NET MVC世界吗? 非常感谢你! 解决方法好吧,经过几天的工作,我终于决定使用HttpContext.Current.Items加载会话.它的作品很棒! 这是我如何做到的 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请求)的会话(例如,在Controller中).当请求完成时,我们需要另一个代码段来调用CloseSession()方法. 在Global.asax.cs中: protected void Application_EndRequest(object sender,EventArgs args)
{
NHibernateSessionManager.CloseSession();
}
会话完成后自动调用Application_EndRequest事件,因此可以正确关闭会话.这是有用的,因为否则我们必须在每个控制器中这样做! (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 用于支持多种语言的ASP MVC技术
- 从项目中的一个ASP.NET页面中删除主题
- asp.net-web-api – 尝试从asp.net web api自主主机中获取用
- asp.net – 在subversion提交时忽略的文件夹
- 如何自定义Asp.net Identity 2用户名已经采取验证消息?
- asp.net – 有没有办法知道是否有人为您的网站添加了书签?
- ASP.NET MVC 3 jQuery验证;禁用不引人注意的OnKeyUp?
- asp.net-mvc – 什么是AsyncManager.OutstandingOperations
- asp.net – System.Net.Cookie和System.Web.HttpCookie有什
- asp.net – NHibernate – ManagedWebSessionContext和WebS
- asp.net – 抛出类型“System.OutOfMemoryExcept
- asp.net-mvc – knockout下拉列表将选择传递给MV
- ASP.NET MVC 2 – 如何使用IgnoreRoute忽略整个目
- ASP.Net MVC 3控制器操作和打开新窗口
- asp.net – 您何时会在Web自定义控件上使用Web用
- asp.net – 在代码而不是数据库中存储salt
- asp.net – 可以使用URI模板来匹配URI到路由吗?
- asp.net-mvc – 如何在Html.TextBox帮助器中设置
- 使用asp.net发送20,000封电子邮件
- 如何在ASP.NET成员资格中访问UserId而不使用Memb
