NHibernate中的API
本篇文章介绍的是NHibernate的各种API及其作用。
下图描述了NHibernate的API在分层架构中的作用,下面将进行详细说明。
NHibernate的接口大致分为四类:
1. 被应用程序调用进行基本数据操作(增、删、改、查)的接口。这些接口是应用程序的业务逻辑层和控制层与NHibernate的主要交互点。ISession, ITransaction, IQuery和ICriteria属于此类。
2. 被应用程序用来配置NHibernate的接口。Configuration就属此类。
3. 回调接口。应用程序用回调接口来响应NHibernate中触发的事件。这类接口包括Interceptor, ILifecycle和IValidatable等。
4. 用于扩展NHibernate的强大映射功能的接口。这类接口通常被应用程序的基础架构来实现。IUserType, ICompositeUserType, 和IIdentifierGenerator属于此类。
NHibernate充分利用.NET中已有的API, 包括ADO.NET和与之对应的ITransaction API,由于ADO.NET提供了针对不同数据库的抽象功能,这就使NHibernate几乎支持所有的数据库。
下面详细介绍NHibernate中的核心接口:
一、核心接口:
1. ISession.
ISession是NHibernate应用程序的主要接口,它提供NHibernate用于查询,更新,存储和删除对象的方法。ISession是轻量级的对象,易于创建和销毁。这一点很重要,因为在NHibernate应用程序中随时都可能需要创建session, 也许每一次页面请求都需要。需要注意的是,NHibernate session不是线程安全的,所以在设计的时候只能同时被一个线程使用。
NHibernate中session的含义介于传统的connection和transaction之间,可以把它看做与一个工作单元相关的对象的缓存或集合,NHibernate能够检测到这个工作单元中对象的变化。有时,Isession也被称作永久化管理器,因为它也是用于永久化操作的一个接口,比如存取对象。需要注意的是,NHibernate中的session和ASP.NET中的session没有任何关系.
2. ISessionFactory.
应用程序从ISessionFactory中获取ISession, ISessionFactory不是轻量级的对象,它被用来在多个应用程序线程中共享。通常整个应用程序中只有一个ISessionFactory的实例, 比如可以在应用程序初始化的时候创建。但是如果你的应用程序需要使用NHibernate访问多个数据库,就需要为每一个数据库创建一个ISessionFactory的实例。
ISessionFactory缓存了NHibernate运行过程中创建的SQL语句和其他的映射数据,它还可以放置一个工作单元中读取并且下一次工作单元或者session中可能用到的数据。ISessionFactory也可以用来配置类和集合的映射来使用二级缓存。
3. Configuration接口。
Configuration类是用来配置NHibernate的。应用程序用Configuration的实例在ISessionFactory创建前配置映射文件的位置以及设置NHibernate特定的属性。
虽然Configuration类在整个NHibernate应用程序中只占很小的一部分,但是它是我们开始用NHibernate时用到的第一个对象。
4. ITransaction接口。
这是一个可选接口,NHibernate应用程序可以不使用这个接口,而自己在基础架构代码中管理事务。NHibernate transaction从底层的事务(比如ADO.NET Transaction或者其他的Transaction)中抽象出来应用程序代码,这样应用程序代码就可以通过一系列连贯的客户端API来控制事务的边界,从而使NHibernate应用程序可以在不同的执行环境和容易中实现可移植性。
5. IQuery和ICriteria接口。
IQuery接口提供了强大的数据库查询能力,同时可以控制查询如何执行,是NHibernate获取数据的基本接口。查询写成HQL或者数据库原始的SQL语句。IQuery是轻量级的,只能在创建它的ISession内使用。它的作用是:绑定参数,限定查询返回的结果条数,然后执行查询。
ICriteria接口是一个与IQuery类似的接口,可以用来创建和执行面向对象的条件查询。
二、回调接口。
当一个对象发生一个事件(比如这个对象被加载、存储和删除)时,回调接口可以让应用程序收到一个通知。NHibernate应用程序并不需要实现这些事件,但是在执行一些通用的任务的时候它们很有用,比如创建审核记录的时候。
ILifeCycle和IValidatable接口让一个永久化对象能够响应与它的永久化生命周期相关的事件。永久化生命周期包含在一个对象的CRUD操作中,也就是在这个对象被创建,提取,更新和删除的时候。
(注意,NHibernate开发团队当初受其他具有这些接口的ORM解决方案的影响,后来他们意识到让永久化类实现这些NHibernate特定的接口会影响可移植性,所以这两个接口已经过期。)
IInterceptor接口可以让应用程序处理事件,同时又不必实现NHibernate特定的接口。IInterceptor接口的实现以参数的形式传递给永久化实例。
三、类型。
NHibernate种类型的概念在架构中是一个基本而有强大的元素。.NET的Type对象将.NET中的类型映射到数据库的列类型(一个类型可能扩展到多个数据表列)。所有永久化类的永久化属性,包括关联在内,都有对应的NHibernate类型。这种设计让NHibernate具有很强的灵活性和可扩展性,因为每一种关系型数据库都有一套NHibernate类型对应。
NHibernate包含了丰富的类型,涵盖了.NET基础类和很多CLR的类,包括DateTime, System.Enum, byte[], 和Serializable 类对应的类型。
NHibernate还支持用户自定义的类型。IUserType, ICompositeUserType和IParameterizedType这些接口就是用来给我们创建自己的类型用的,我们也可以用IUserCollectionType创建自己的集合类。NHibernate的这个特性,可以让我们很方便而简洁的处理应用程序中用到的类,比如Address,Name和MoneyAccount。自定义类型是NHibernate的一个核心属性,NHibernate团队鼓励我们尽量多并且有创造性的使用它。
四、扩展接口
NHibernate提供的大部分功能都是可配置的,这就允许我们在一些内置策略之间进行选择。当内置的策略足以满足我们的需要时,NHibernate还允许我们通过实现一些接口来插入我们自己的功能实现。插入点包括:
1. 主键的生成(IIdentifierGenerator接口)
2. SQL语言的支持(Dialect抽象类)
3. 缓存策略(ICache和ICacheProvider接口)。
4. ADO.NET连接管理(IConnectionProvider接口)。
5. 事务管理(ITransactionFactory和ITransaction接口)。
6. ORM策略(IClassPersister接口层级)
7. 属性访问策略(IPropertyAccessor接口)。
8. 代理创建(IProxyFactory接口)。
对于上述接口,NHibernate已经带了至少一种实现,所以,如果我们想扩展这些内置的功能,并不需要从头开始。