日期:2008-04-27  浏览次数:20366 次

配置信息用于指定NH以何种方式访问数据库, 根据这些配置信息, NH动态的创建数据访问对象并与数据库进行交互. 除了.net类库自带的Odbc, OleDb, OracleClient和SqlClient访问方式外, 在0.2版中, NH增加了用于访问MySQL和Firebird的访问方式, 这两种访问方式由第三方组件提供, mono的用户应该高兴了. :)

NH的配置有两种存放方式

  1. 存放在应用程序集的配置文件中, 对于Web应用程序则存放在Web.config中. 这种方式必须指定配置节的处理程序(类);
  2. 存放在一个单独的XML文件中, 使用这种方式我们必须在程序中显式的加载配置文件, 本文后面有详细说明. 此方式有一个优点, 就是在多数据库的情况下, 可以用不同的配置文件与各个数据库进行对应.

配置内容

先来看看配置内容, 下列是一个简单的配置例子:

<nhibernate>
<add
   key="hibernate.connection.provider"
   value="NHibernate.Connection.DriverConnectionProvider"
/>
连接提供者,取值必须是实现了IConnectionProvider接口的类的全名,当前版本只能取值NHibernate.Connection.DriverConnectionProvider.

<add
   key="hibernate.dialect"
   value="NHibernate.Dialect.MsSql2000Dialect"
/>
数据库方言,取值必须是继承之Dialect的类的全名,最常用的就是NHibernate.Dialect.MsSql2000Dialect了吧, 谁让它是M$的了.

<add
   key="hibernate.connection.driver_class"
   value="NHibernate.Driver.SqlClientDriver"
/>
数据驱动类,取值必须是实现了IDriver接口的类的全名,常用的选择有NHibernate.Driver.SqlClientDriver, NHibernate.Driver.OleDbDriver等, 不过现在又多了ByteFXDataDriver(访问MySQL).

<add
   key="hibernate.connection.connection_string"
   value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"
/>
连接字符串,取值要与driver_class指定的数据驱动类对应.

</nhibernate>

配置节处理程序

因为NH的配置信息为自定义配置节, 所以必须指定配置节处理程序, NH的配置内容采用key/value形式,这和预定义配置节appSettings是一样的,我们只要用.net内置的配置节处理程序就可以处理NH的配置内容了, 这个处理key/value形式的类就是NameValueSetionHandler.

nhibernate配置节的声明如下:

<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
注意Version的值对于不同的.net framework版本取值也可能不一样.

在nh中, Environment类用于读取配置信息, 代码如下

//*** Environment.cs - 65行 ***
static Environment() {
   NameValueCollection props = System.Configuration.ConfigurationSettings.GetConfig("nhibernate") as NameValueCollection;
   if (props==null) {
      return;
   }

   foreach(string key in props.Keys) {
      properties[key] = props[key];
   }
}
这是一个静态构造函数, 在静态成员首次调用时执行.
配置信息放在properties集合中.

//*** Environment.cs - 90行 ***
public static IDictionary Properties {
   get {
      IDictionary copy = new Hashtable(properties.Count);
      foreach(DictionaryEntry de in properties) {
         copy[de.Key] = de.Value;
      }
      return copy;
   }
}
Properties属性用于访问配置信息, 注意这里并没有直接返回properties, 而是复制了一个集合用于返回.
曾有网友问为什么不是直接返回properties? 可能的原因是如果返回properties(即引用)话, 那么配置信息将是共享的, 如果在程序中修改了properties, 那么将影响到其它地方.
另外Environment类中还定义了一些属性名称常数.

在程序中操作配置信息

除了在配置文件中指定nh的配置信息外, nh还允许我们在程序中操作配置信息, 这对于一些敏感的数据,如数据库连接串,提供了一种安全的操作方法(可以在程序中加入连接串属性,而不用将其存储在配置文件中).

Configuration类提供提供两个方法和一个属性用于操作配置信息.

//*** Configuration.cs - 637行 ***
public Configuration AddProperties(IDictionary properties) {
   foreach(DictionaryEntry de in properties) {
      this.properties.Add(de.Key, de.Value);
   }
   return this;
}
将一个数据字典对象加入到配置属性中.

//**