在.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,代码如下:

ExpandedBlockStart.gif ContractedBlock.gif      /**/ /// <summary>
    
/// 在.NET应用程序中,为一个单线程
    
/// 在ASP.NET应用程序中,为一个请求
    
/// </summary>
    
/// <author>Kevin</author>

     public   class  SessionHolder
ExpandedBlockStart.gifContractedBlock.gif    
{
        
private HolderSupport holderSupport;

        
public SessionHolder()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (HttpContext.Current != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                holderSupport 
= new AspNetHolderSupport();
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                holderSupport 
= new NetHolderSupport();
            }

        }


        
public ISession Get()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
return holderSupport.Get();
        }


        
public void Set(ISession session)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            holderSupport.Set(session);
        }


        
class NetHolderSupport : HolderSupport
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            [ThreadStatic]
            
private static ISession threadLocal;

            
public ISession Get()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (threadLocal != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
if (!threadLocal.IsConnected)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        threadLocal.Reconnect();
                    }

                }


                
return threadLocal;
            }


            
public void Set(ISession session)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (session == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    threadLocal 
= null;
                    
return;
                }


                
if (!session.IsConnected)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    session.Reconnect();
                }


                threadLocal 
= session;
            }

        }


        
class AspNetHolderSupport:HolderSupport
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
private readonly object DEFAULT_SESSION_KEY = new object();

            
public ISession Get()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return HttpContext.Current.Items[DEFAULT_SESSION_KEY] as ISession;
            }


            
public void Set(ISession session)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (session != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    HttpContext.Current.Items.Add(DEFAULT_SESSION_KEY, session);
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    HttpContext.Current.Items.Remove(DEFAULT_SESSION_KEY);
                }

            }

        }


        
interface HolderSupport
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            ISession Get();
            
void Set(ISession session);
        }

    }


 

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

public   abstract   class  SessionFactoryUtil
ExpandedBlockStart.gifContractedBlock.gif    
{
        
private static readonly object lockObj = new object();
 
        
private static ISessionFactory factory;

        
private static readonly SessionHolder holder = new SessionHolder(); 

        
public static ISessionFactory Factory
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (factory == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
lock (lockObj)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
if (factory == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            Configuration cfg 
= new Configuration();
                            cfg.AddAssembly(Assembly.GetExecutingAssembly());
                            factory 
= cfg.BuildSessionFactory();
                        }

                    }

                }


                
return factory;
            }

        }


        
public static ISession CurrentSession()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            ISession session 
= holder.Get();

            
if (session == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                session 
= Factory.OpenSession();
                holder.Set(session);
            }


            
return session;
        }


        
public static void CloseSession()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            ISession session 
= holder.Get();

            
if (session != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                session.Close();                
            }


            holder.Set(
null);
        }

    }

转载于:https://www.cnblogs.com/kevin002/archive/2008/07/28/1254705.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值