[翻译]NHibernate1.2.0文档学习(2)-架构

 

第一章       架构

2.1    概览

Nhibernate的总体架构:
    

该图表描述了Nh ibernate使用数据库和配置数据给应用程序提供持久化服务(持久化对象)。

我们想得到这个架构更加详细的描述。不幸的是,Nhibernate非常灵活和有很多方法。因此,我们将只描述两个极端情况。这”最小”架构是应用程序使用它自己的ADO.NET连接和管理它自己的事务。这个方法使用了Nhibernate APIs中最小结果集。
    

全面”架构把应用程序从ADO.NET APIs中抽象出来,使Nhibernate去关注细节。
    

下面列出了图表中几个对象的定义:

ISessionFactory(Nhibernate.ISessionFactory)

一个用于单个数据库的被编译过的映射文件的线程安全的缓存。工厂是用于ISession和IconnectionProvider的客户端。在多个处理器上,数据用于在事务之间重用,可以使用一个可选的二级缓存。

Isession(Nhibernate.ISession)

一个单线程的,短生命周期的对象,代表了应用程序和持久化存储之间的一次会话。它封装了ADO.NET连接。是ITransaction的工厂。它拥有持久化对象的一级缓存,用于遍历对象或通过标识符查找对象。

Persistent Objects and Collections

包含了持久化状态和业务功能的单线程、短生命期的对象。它们可能仍然是原来的POCOs,唯一不同的是它们现在和唯一的Isession关联。一旦Session关闭了,它们就被分离出来,并且可以在任何应用程序层自由使用。(比如:直接作为数据传输对象传送到表现层)

Transient Objects and Collections

它们是持久化类的实例,当前它们并没有关联到ISession。它们可能已经被应用程序实例化但没有持久化,或者它们被一个关闭的ISession实例化了。

ITransaction (NHibernate.ITransaction)

(可选的)一个单线程,短生命周期对象,被应用程序用于指定一批工作的原子操作。它是从底层的ADO.NET事务中抽象出来的。在有些情况下,一个ISession可能跨越好几个ITransaction

IConnectionProvider (NHibernate.Connection.IConnectionProvider)

(可选的)一个提供ADO.NET连接和命令的工厂。它是从具体的IdbConnectionIdbCommand中抽象出来的。开发者可以扩展和实现它,但是不要暴露给应用程序。

IDriver (NHibernate.Driver.IDriver)

(可选的)一个封装了各个不同ADO.NET提供程序的不同点的接口。比如:参数命名约定和支持ADO.NET特性。

ITransactionFactory (NHibernate.Transaction.ITransactionFactory)

(可选的)一个用于产生ITransaction实例的工厂。不能暴露给应用程序,但是开发者可以扩展和实现它。

对于“最小”的架构集,应用程序通过ITransaction/ITransactionFactoryIConnectionProvider APIsADO.NET进行联系。

2.2     实例状态

持久化类的状态处在三个不同的状态中的一个,这三个状态的定义与一个持久化上下文有关。Nhibernate的ISession对象就是持久化上下文。

Transient

       实例对象还不是,或没有和任何持久化上下文联合。它还没有持久化标识符(主键值)

Persistent

       当前该实例和持久化上下文相关联。该实例含有一个持久化标识符(主键值),同时,可能在数据库中有对应的一行。对于一个指定的持久化上下文,Nhibernate保证了持久化标识符和CLR标识符(对象在内存中的位置)相等。

Detached

       该实例和持久化上下文有过一次关联,但是那个持久化上下文已经关闭了,或者是该实例是被序列化到另一个处理过程中。该实例有一个持久化标识符,同时,可能在数据库中有对应的一行。对于分离的实例,Nhibernate并不保证持久化实例和CLR实例的相等关系。

2.3     上下文有关的Session

大多数使用Nhibernate的应用程序需要一些含有”Contextual”Session的格式,在指定的上下文的作用范围内,一个指定的Session是起作用的。然而,通过应用程序发现,组成一个上下文的定义是明显不同的,所有不同的上下文定义了当前概念的不同范围。

1.2版本开始,Nhibernate增加了ISessionFactory.GetCurrentSession()方法。在ISessionFactory.GetCurrentSession()之后的处理是紧密的。一个扩展的接口(Nhibernate.Context.ICurrentSessionContext)和一个新的配置参数(hibernate.current_session_context_class)已经被添加to allow pluggability of the scope和允许定义当前Session的上下文。

查看Nhibernate.Context.IcurrentSessionContext接口的API文档可以了解这份契约的更多细节。它定义了一个方法CurrentSession(),通过实现这个方法可以负责跟踪当前上下文相关Session。当然,Nhibernate提供了这个接口的一个实现。

Nhibernate.Context.ManagedWebSessionContext—当前Session是被HttpContext跟踪。但是,在类中你自己通过使用静态方法负责绑定和解除绑定一个ISession实例,它自己不会打开,缓冲,或者关闭ISession本身。

Hibernate.current_session_context_class配置参数定义了哪个实现Nhibernate.Context.IcurrentSessionContext应该被使用。典型的,这个参数的值用于命名将被使用的实现类(包括程序集)。然而,对应于上面的实现,它取名为”managed_web”

posted @ 2008-05-15 19:30  潮儿  阅读(692)  评论(0编辑  收藏  举报