本篇文章介绍的是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已经带了至少一种实现,所以,如果我们想扩展这些内置的功能,并不需要从头开始。

NHibernate中的API的更多相关文章

  1. HDFS中JAVA API的使用

    HDFS中JAVA API的使用   HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...

  2. Appium中部分api的使用方法

    使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建议多参考java-client-2.1.0-javadoc. 1.使用Andr ...

  3. NHibernate中,查询SqlServer数据库多个实体对象

    关于datetime类型使用:  Oracle:  "and tb.EffectiveDate >= to_date(?,'yyyy-mm')" Sql:  "an ...

  4. VB中的API详解

    一.API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解. Win32 API即为Microsoft 32位平台的应用程序编程接口(Appl ...

  5. elasticsearch中的API

    elasticsearch中的API es中的API按照大类分为下面几种: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作 查看A ...

  6. NHibernate 中删除数据的几种方法

    今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...

  7. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  8. NHibernate 中使用 nvarchar(max) 类型

    在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 ...

  9. C#中调用API

    介绍 API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能 ...

随机推荐

  1. Go语言之高级篇beego框架之请求数据处理

    1.Controller中数据参数处理 获取参数:我们经常需要获取用户传递的数据,包括 Get.POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据: GetStri ...

  2. linux-提示用户不在 sudoers文件中,此事将被报告。

    在安装oracle创建用户后使用su – oracle命令进入执行相关修改信息(vi file命令)时提示无权限修改 “Can't open file for writing”或“operation ...

  3. Python 读取WAV文件并绘制波形图

    aa Python 读取WAV文件并绘制波形图 ffmpeg -i test_pcm_mulaw.wav -f wav -codec:a pcm_s16le -ar 8000 -ac 1 out.wa ...

  4. 使用Github添加标签

    Github为我们提供了在页面上进行编辑发行版本的方式,如下图所示: 在Github上为项目打tag可在release页面,选择创建新tag并按下图所示填写即可.删除tag也同理.

  5. PPTP 在Centos 7.1 建立方法与失效处理

    # yum install pptp pptp-setup pptpsetup --create vpn --server  (serverName) --username (Username)  - ...

  6. MYSQL浮点型转int类型

    cast('3.15926' as signed) cast(浮点型 as signed)

  7. 阿里云k8s应用最新日志采集不到的问题

    问题描述: 阿里云k8s应用日志之前一直都是可以正常的采集, 先出现一问题, 通过kibana 和阿里云的日志服务都没法展示最新的k8s应用的日志, 部分应用的最新日志有被采集到,但大部分应用日志没有 ...

  8. 应用程序默认安装在C盘后启动时提示权限不足想起的。。。

    最近不少经销商用户反映,在使用win 7的系统的电脑上安装我们的软件后,开启系统时提示权限不足,无法启动软件. 而在xp系统下则没有这个问题,原因在于我们将系统的默认安装路径选择在了C盘了,而win ...

  9. GCD使用:让程序在后台较长久的运行(UIBackgroundTaskIdentifier )

        在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作.但是在使用GCD后,app最多有10分钟的时间在后台长久运行.这个时间可以用来做清理本地 ...

  10. 利用linux的mtrace命令定位内存泄露(Memory Leak)

    一谈到内存泄露, 多数程序猿都闻之色变. 没错, 内存泄露非常easy引入. 但非常难定位.  以你我的手机为例(如果不常常关机). 如果每天泄露一些内存, 那么開始的一个星期, 你会发现手机好好的. ...