在Window Form中使用NHibernate

在Window Form中使用NHibernate也主要是实体配置文件的加载(会话工厂)和对session的管理。

会话工厂
Configuration.BuildSessionFactory()是很昂贵的操作(特别是当有很多实体类的时候),所以一般使用Singleton模式来建立会话工厂来一次性将所有实体配置加载。
Session的管理器
由于建立一个session是比较耗费资源的,所以为了不频繁地打开和关闭session,可以使用 ThreadStaticAttribute(具体请看MSDN),或者TLS,比如在 张老三的文章中的用法:
ExpandedBlockStart.gif ContractedBlock.gif public   class  SessionManager  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public static void SetSession( ISession session ) dot.gif{
InBlock.gif      Thread.SetData( Thread.GetNamedDataSlot(
"session"), session );
ExpandedSubBlockEnd.gif   }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public static ISession GetSession()  dot.gif{
InBlock.gif      
object obj = Thread.GetData( Thread.GetNamedDataSlot("session") );
InBlock.gif      
if ( obj == null )
InBlock.gif         
throw new Exception( "no session object!" );
InBlock.gif
InBlock.gif      
return (ISession)obj;
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}
  // class SessionManager

注意此用法在ASP.NET中就不是好的做法了,道理很简单,每个Request可能会有多个session为其服务,使用TLS的话会在每个Thread上打开一个NHiberante的session,这显然是比较浪费的;为了在一个Request中能共享NHiberante的session,可以使用HttpContext.Current.Items来保存之,这在我的前一个post中已经提到了。

处理多数据库连接

NHibernate的配置中是只有一个数据库连接的,当需要多个不同的数据库连接的时候,可以新增加一个xml配置文件(hibernate.cfg.xml),其内容如:

None.gif < hibernate-configuration   xmlns ="urn:nhibernate-configuration-2.0"   >
None.gif    
< session-factory  name ="NHibernate.Test" >
None.gif        
<!--  properties  -->
None.gif        
< property  name ="connection.provider" > NHibernate.Connection.DriverConnectionProvider </ property >
None.gif        
< property  name ="connection.driver_class" > NHibernate.Driver.SqlClientDriver </ property >
None.gif        
< property  name ="connection.connection_string" > Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI </ property >
None.gif        
< property  name ="show_sql" > false </ property >
None.gif        
< property  name ="dialect" > NHibernate.Dialect.MsSql2000Dialect </ property >
None.gif        
< property  name ="use_outer_join" > true </ property >
None.gif        
< property  name ="query.substitutions" > true 1, false 0, yes 'Y', no 'N' </ property >
None.gif        
<!--  mapping files  -->
None.gif        
< mapping  assembly ="NHibernate.Examples"   />
None.gif    
</ session-factory >
None.gif    
None.gif
</ hibernate-configuration >


代码类似于:

None.gif          private   void  Config( string  configXmlFile,Type[] types)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {            
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                nConfig 
= new Configuration();
InBlock.gif                nConfig.Configure(configXmlFile);
InBlock.gif
InBlock.gif                
for ( int i=0;i<types.Length;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    nConfig.AddClass(types[i]);
ExpandedSubBlockEnd.gif                }

InBlock.gif                nSessionFactory 
= nConfig.BuildSessionFactory();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw e;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

另外,请参考 codeproject上的一个在winform中使用NHibernate的例子,注意其代码也有一些不合理的地方。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值