Nhibernate one Session per Request的实现
时间:2010-09-29 来源:异样的世界
网上关于NHibernate one Session per Request实现的例子有很多,那些例子看的我是晕晕乎乎的,经过陆经理的给我讲解明白了Nhibernate one Session per Request并没有网上写的那么复杂,它只不过是一个请求和响应而已。个人认为NHibernate one session per Request和Asp.net中的HttpResponse HttpRequest的功能一样。
实现NHibernate one Session per Request 首先在Hibernate.cft.xml中加入Property配置
<property name="current_session_context_class">Managed_Web</property>
此句是制定SessionContext的实现类。你在NHibernate中文文档中可以看到以下的内置实现,简写为“"managed_web", "call","thread_static", and "web"你也可以自定义。
然后我们创建一个NHibernateSessionFactory的类核心代码如下
代码
1
2
3
4 public class NHibernateSessionFactory : ICurrentSessionContext
5 {
6 public static readonly string CurrentSessionKey = "NHibernate.Context.WebSessionContext.SessionFactoryMapKey";
7
8 private ISessionFactory sessionFactory;
9
10 public NHibernateSessionFactory(ISessionFactory sessionFactory)
11 {
12 this.sessionFactory = sessionFactory;
13 }
14 //增加CurrentSession属性
15 public ISession CurrentSession()
16 {
17 ISession currentSession = HttpContext.Current.Items[CurrentSessionKey] as ISession;
18 if (currentSession == null)
19 {
20 currentSession = sessionFactory.OpenSession();
21 HttpContext.Current.Items[CurrentSessionKey] = currentSession;
22 }
23 return currentSession;
24 }
25
26 //关闭Session
27 public static void CloseSession()
28 {
29 ISession currentSession = HttpContext.Current.Items[CurrentSessionKey] as ISession;
30 if (currentSession != null) currentSession.Close();
31 HttpContext.Current.Items.Remove(CurrentSessionKey);
32 }
33
34 }
35 }
上面这段代码的主要意思是判断CurrentSession是否为NULL,如果为NULL就新建一个Seesion最后是关闭Session.在网上很多人在这一块写的很繁琐看的我晕乎乎!!当我掌握之后感觉也就是那么回事,没必要写那么多。
写完NHibernateSessionFactory这个类之后我们在Global.asax中注册一下。
首先是在Global.asax中写一个构造函数,然后写一个EndRequst方法,BeginRequest的方法就没必要去写了。
代码
public MvcApplication()
{
EndRequest += new EventHandler(MvcApplication_EndRequest);
}
//一定关闭Session
void MvcApplication_EndRequest(object sender, EventArgs e)
{
NHibernateSessionFactory.CloseSession();
}
写到这里One Session per Request的配置是基本OK了,当我们用的时候直接调用CurrentSession的方法就可以了。