NHibernate 架构浅析
先看一张非常高层次的、抽象的 NHibernate 架构视图。从这张图可以看出, NHibernate 使用数据库和配置数据为应用程序提供持久化服务(以及持久化对象)。
我们可能更希望看到它的更加详细的运行时架构,然而由于 NHibernate 是很灵活的,它支持不同的用法,所以这个运行时架构视图也有不同的版本,下面展示两个极端的 NHibernate 运行时架构。
轻量级的架构可以让应用程序提供自己的 ADO.NET 连接并管理事务, 这种用法仅使用了 NHibernate API 的最小子集,如下图所示。
全功能架构使应用程序与底层的 ADO.NET API 抽象隔离, 而让 NHibernate 关注具体实现。
该架构视图中几个对象的定义:
- ISessionFactory (NHibernate.ISessionFactory)
经过编译的单个数据库的映射的缓存, 是线程安全的且不可变的, 是 ISession 的工厂, IConnectionProvider 的客户端, 可能保存用于跨事务的二级缓存数据, 是进程级别或者群集级别的对象。 - ISession (NHibernate.ISession)
单线程,生命周期短的对象,表示应用程序和持久化存储之间的一个对话, 封装一个 ADO.NET 连接。 它是 ITransaction 的工厂,保存持久化对象的一级缓存, 在对象图中导航或者按照标识查找对象时使用。 - Persistent Objects and Collections
持久化对象与集合,包含持久化状态和业务功能的单线程、短周期对象, 通常可以是一般对象 (POCO), 唯一的特殊性是与一个且只有一个 ISession 相关联, 一旦 Session 被关闭, 他们将会与 Session 分离, 从而可以在应用程序任意层使用(例如直接被用作进出表示层的数据传输对象)。 - Transient Objects and Collections
没有与 ISession 关联的持久化类的实例。他们可能由应用程序初始化且不做持久化,也可能是被一个已经关闭的 ISession 初始化。 - ITransaction (NHibernate.ITransAction)
抽象事务,一个单线程的短周期对象,被应用程序用来表示原子单位的工作, 使应用程序和底层的 ADO.NET 事务相隔离,在某些情况下,一个 ISession 需要跨越多个事务。(这是一个可选对象) - IConnectionProvider (NHibernate.Connection.IConnectionProvider)
ADO.NET 连接和命令的工厂, 将应用程序与特定数据库实现的 IDbConnection 和 IDbCommand , 不向应用程序暴露,但是可以被开发人员扩展或实现。(这是一个可选对象) - IDriver (NHibernate.Driver.IDriver)
封装不同的 ADO.NET 之间的差异的接口, 比如参数命名转换、受支持的 ADO.NET 特性等。(这是一个可选对象) - ITransactionFactory (NHibernate.Transaction.ITransactionFactory)
ITransaction 的工厂, 不向应用程序暴露,但是可以被开发人员扩展或实现。(这是一个可选对象)
在轻量级架构中,应用程序绕开 ITransaction/ITransactionFactory 和 /IConnectionProvider ,直接使用 ADO.Net 事务。
张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
本博客已经迁移到 GitHub , 围观地址: https://beginor.github.io/