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/
浙公網安備 33010602011771號