位置于:书籍教程首页>>编程开发>>Asp.net教程>>正文

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

资料:http://xp163.com/

会话工厂是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 (persister|| persister{         cp = new EntityPersister(model, this);      } else if (persister{         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类。// 部分内容等有空再补充。



 nhibernate源码分析之二:会话工厂相关说明
 nhibernate源码分析之二:会话工厂相关说明

 

 书籍教程站内推荐信息
 书籍教程网站地图