NHibernate源码一: 配置信息
NH的配置有两种存放方式
- 存放在应用程序集的配置文件中, 对于Web应用程序则存放在Web.config中. 这种方式必须指定配置节的处理程序(类);
- 存放在一个单独的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>
在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;
}
将一个数据字典对象加入到配置属性中.
//*** Configuration.cs - 646行 ***
public Configuration SetProperty(string name, string value) {
properties[name] = value;
return this;
}
设置指定的属性的值, name应使用Environment类中定义的那些属性名称常数.
//*** Configuration.cs - 625行 ***
public IDictionary Properties {
get { return properties; }
set { this.properties = value; }
}
这个就不用多说的吧, 用dotNet的人都知道.有了Properties, 想干啥就干啥吧 :-)