nhibernate源码分析之二: 会话工厂

nhibernate源码分析之二: 会话工厂

                                                                                                                                         作者:张老三
会话工厂是NHibernate中的关键类,它与数据库连接、数据库事务等进行交互,还存储着与所有持久对象类型关联的持久化对象,持久化类是持久化的关键,它实现基本的CRUD操作。
当用户需要持久操作时,由会话工厂创建一个会话供用户进行持久操作。

1. 会话工厂的创建

会话工厂由ISessionFactory接口实现,由Configuration的BuildSessionFactory方法创建,会话工厂应该使用Singleton模式。
如果要访问多个数据库,应建立多个会话工厂。

//*** Configuration.cs ***

public ISessionFactory BuildSessionFactory() {
   // ...

   Hashtable copy = new Hashtable();
   foreach(DictionaryEntry de in properties) {
      copy.Add(de.Key, de.Value);
   }
   return new SessionFactoryImpl(this, copy, interceptor);
}
其中SessionFactoryImpl为实现ISessionFactory的类,这个类的修饰为Internal。

2. 持久化类的创建

持久化类用于对持久对象进行持久化操作,每一个持久对象类型都有一个与之关联的持久化对象。
持久化类继承自IClassPersister接口,这个接口定义了用于持久对象的CRUD操作。

//*** SessionFactoryImpl ***

private IDictionary classPersisters;
持久化对象集合,Key为持久对象的类型;

private IDictionary classPersistersByName;
持久化对象集合,Key为持久对象的类名;

public SessionFactoryImpl(Configuration cfg, IDictionary properties, IInterceptor interceptor) {
   // ...

   foreach(PersistentClass model in cfg.ClassMappings) {
      System.Type persisterClass = model.Persister;
      IClassPersister cp;
      //TODO: H2.0.3 created a PersisterFactory
      if (persisterClass==null || persisterClass==typeof(EntityPersister)) {
         cp = new EntityPersister(model, this);
      } else if (persisterClass==typeof(NormalizedEntityPersister)) {
         cp = new NormalizedEntityPersister(model, this);
      } else {
         cp = InstantiatePersister(persisterClass, model);
      }
      classPersisters[model.PersistentClazz] = cp;
      classPersistersByName[model.Name] = cp ;
   }

   // ...
}
在构造函数中遍历所有持久类映射信息,然后根据持久类的持久类型建立一个持久化对象,并将此对象加入到集合中。
InstantiatePersister用于创建一个自定义的持久化对象,类名称由映射文件中Class节点的Persister属性指定,自定义持久化类必须实现IClassPersister接口.

3. 连接提供者

连接提供者由IConnectionProvider接口实现,会话工厂通过连接提供者与持久机制(数据库等)进行交互,例如取得数据库连接等。

//*** SessionFactoryImpl.cs ***

public SessionFactoryImpl(Configuration cfg, IDictionary properties, IInterceptor interceptor) {
   // ...
   connectionProvider = ConnectionProviderFactory.NewConnectionProvider(properties);
   // ...
}
还是在构造函数中,连接提供者由连接提供者工厂根据配置属性来创建。

//*** ConnectionProviderFactory ***

public static IConnectionProvider NewConnectionProvider(IDictionary settings) {
   IConnectionProvider connections = null;
   string providerClass = settings[Cfg.Environment.ConnectionProvider] as string;
   if (providerClass != null) {
      try {
         connections = (IConnectionProvider) Activator.CreateInstance(System.Type.GetType(providerClass));
      }
      catch (Exception e) {
         throw new HibernateException("Could not instantiate connection provider: " + providerClass);
      }
   }
   else {
      throw new NotImplementedException("We have not implemented user supplied connections yet.");
   }

   connections.Configure(settings);
   return connections;
}
NewConnectionProvider方法通过配置中ConnectionProvider的值来创建连接提供者。当前版本(v0.0.5)唯一可用的提供者只有DriverConnectionProvider类。

// 部分内容等有空再补充。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值