ISessionFactory是Nhibernate内部的核心类,它维护到持久机制(数据库)的连接并对它们进行管理,同时还会保存所有持久对象的映射信息,它的由Configuration创建,因为创建ISessionFactory的开销非常大(需要加载映射信息),所以这个对象一般使用Singleton(单例)模式。
而在msdn中对静态类和静态成员是这样解释的:
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
class SimpleClass
{
// Static constructor
static SimpleClass()
{
//...
}
{
// Static constructor
static SimpleClass()
{
//...
}
静态构造函数具有以下特点:
静态构造函数既没有访问修饰符,也没有参数。
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
无法直接调用静态构造函数。
在程序中,用户无法控制何时执行静态构造函数。
静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
我对该特性编写了一小段程序进行了测试,如下:
class StaticTest
{
public static int count = 1;
static StaticTest()
{
count ++;
}
{
public static int count = 1;
static StaticTest()
{
count ++;
}
public static int report()
{
count++;
return count;
}
}
{
count++;
return count;
}
}
然后我建了一个winform的project,在一个button的点击事件里放入了
MessageBox.Show(StaticTest.report().ToString());
然后会发现每次点击,count都加1,而第一次点击,因为执行了构造函数而加了2,由此可看出静态类的成员状态是维持的,而且构造函数是只执行一次。
由上面的静态构造函数和静态类的特性可知,我们可以创建一个静态类来管理Nhibernate的ISessionFactory和ISession等,而ISessionFactory的创建可以放在静态构造函数中,这样就保证了整个进程只创建一次。