在.Net中存放NHibernate的Session值

最近一个项目要用到.Net,用久了Hibernate直接用ADO.NET手写SQL的话真还有点不适应,还好NHibernate提供了对.Net的ORM支持。在使用Hibernate的时候

,可以使用ThreadLoca来存放Session的。ThreadLoca是给每个线程提供单独的静态变量,在一个线程内部共享,而不同的线程间不共享。在.Net中找了好长时间

,终于找到了ThreadStaticAttribute ,它指示静态字段的值对于每个线程都是唯一的。在WinFrom,控制台应用程序和类库等中的确是可以用的。但在Asp.Net中

HttpRequest则可能有多个线程为其服务。如果用ThreadStaticAttribute 的话,很有可能同一个请求使用多个线程那么数据就不能共享了。不过我们可以使用

HttpContext.Current.Items来存放session。所以就自己写一个等同ThreadLocal的类来存放Session,代码如下:

在.Net中存放NHibernate的Session值      /// <summary>
在.Net中存放NHibernate的Session值    
/// 在.NET应用程序中,为一个单线程
在.Net中存放NHibernate的Session值    
/// 在ASP.NET应用程序中,为一个请求
在.Net中存放NHibernate的Session值    
/// </summary>
在.Net中存放NHibernate的Session值    
/// <author>Kevin</author>

在.Net中存放NHibernate的Session值      public   class  SessionHolder
在.Net中存放NHibernate的Session值    
{
在.Net中存放NHibernate的Session值        
private HolderSupport holderSupport;
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public SessionHolder()
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            
if (HttpContext.Current != null)
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                holderSupport 
= new AspNetHolderSupport();
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值            
else
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                holderSupport 
= new NetHolderSupport();
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public ISession Get()
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            
return holderSupport.Get();
在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public void Set(ISession session)
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            holderSupport.Set(session);
在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
class NetHolderSupport : HolderSupport
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            [ThreadStatic]
在.Net中存放NHibernate的Session值            
private static ISession threadLocal;
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
public ISession Get()
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                
if (threadLocal != null)
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    
if (!threadLocal.IsConnected)
在.Net中存放NHibernate的Session值                    
{
在.Net中存放NHibernate的Session值                        threadLocal.Reconnect();
在.Net中存放NHibernate的Session值                    }

在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值                
return threadLocal;
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
public void Set(ISession session)
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                
if (session == null)
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    threadLocal 
= null;
在.Net中存放NHibernate的Session值                    
return;
在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值                
if (!session.IsConnected)
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    session.Reconnect();
在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值                threadLocal 
= session;
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
class AspNetHolderSupport:HolderSupport
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            
private readonly object DEFAULT_SESSION_KEY = new object();
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
public ISession Get()
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                
return HttpContext.Current.Items[DEFAULT_SESSION_KEY] as ISession;
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
public void Set(ISession session)
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                
if (session != null)
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    HttpContext.Current.Items.Add(DEFAULT_SESSION_KEY, session);
在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值                
else
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    HttpContext.Current.Items.Remove(DEFAULT_SESSION_KEY);
在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
interface HolderSupport
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            ISession Get();
在.Net中存放NHibernate的Session值            
void Set(ISession session);
在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值    }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值

 

    自己又写了一个SessionFactoryUtil类,用来打开和关闭Session,代码如下:
   

在.Net中存放NHibernate的Session值 public   abstract   class  SessionFactoryUtil
在.Net中存放NHibernate的Session值    
{
在.Net中存放NHibernate的Session值        
private static readonly object lockObj = new object();
在.Net中存放NHibernate的Session值 
在.Net中存放NHibernate的Session值        
private static ISessionFactory factory;
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
private static readonly SessionHolder holder = new SessionHolder(); 
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public static ISessionFactory Factory
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            
get
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                
if (factory == null)
在.Net中存放NHibernate的Session值                
{
在.Net中存放NHibernate的Session值                    
lock (lockObj)
在.Net中存放NHibernate的Session值                    
{
在.Net中存放NHibernate的Session值                        
if (factory == null)
在.Net中存放NHibernate的Session值                        
{
在.Net中存放NHibernate的Session值                            Configuration cfg 
= new Configuration();
在.Net中存放NHibernate的Session值                            cfg.AddAssembly(Assembly.GetExecutingAssembly());
在.Net中存放NHibernate的Session值                            factory 
= cfg.BuildSessionFactory();
在.Net中存放NHibernate的Session值                        }

在.Net中存放NHibernate的Session值                    }

在.Net中存放NHibernate的Session值                }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值                
return factory;
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public static ISession CurrentSession()
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            ISession session 
= holder.Get();
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
if (session == null)
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                session 
= Factory.OpenSession();
在.Net中存放NHibernate的Session值                holder.Set(session);
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
return session;
在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值        
public static void CloseSession()
在.Net中存放NHibernate的Session值        
{
在.Net中存放NHibernate的Session值            ISession session 
= holder.Get();
在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            
if (session != null)
在.Net中存放NHibernate的Session值            
{
在.Net中存放NHibernate的Session值                session.Close();                
在.Net中存放NHibernate的Session值            }

在.Net中存放NHibernate的Session值
在.Net中存放NHibernate的Session值            holder.Set(
null);
在.Net中存放NHibernate的Session值        }

在.Net中存放NHibernate的Session值    }

在.Net中存放NHibernate的Session值

你可能感兴趣的:(Hibernate)