欢迎光临
我们一直在努力

nhibernate源码分析之二:会话工厂-.NET教程,VB.Net语言

建站超值云服务器,限时71元/月

会话工厂是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)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » nhibernate源码分析之二:会话工厂-.NET教程,VB.Net语言
分享到: 更多 (0)

相关推荐

  • 暂无文章