2.2 理解NHibernate的結構
程式的介面是你最先要學習的。API設計的目的是越少越好,但是ORM的API並不是那麼的小。不過不要擔心,你不必一次性全部理解所有的NHibernate介面。
Figure2.1說明了NHibernate最重要的介面的角色在商務邏輯層和持久化層。把business層在持久化層的上面是因為商務邏輯是持久化層的一個使用者。
在Figure2.1中的NHibernate介面可以大概分類如下:
1、 介面被程式調用去展示基本的操作(增刪查改)。這些是NHibernate的主要介面。它們包括ISession、ITracsaction、IQuery和ICriteria。
2、 介面用來配置NHibernate。最重要的是Configuration類。
3、 回調介面,使程式對事件器作用。例如IInterceptor、ILifecycle和IValidatable。
4、 介面允許擴充NHibernate的映射功能。例如IUserType、ICompositeUserType和IIdentifierGenerator。
NHibernate使用.NET的API,包括ADO.NET和ITransactionAPI。ADO.NET提供了最基礎的與資料庫發生互動,而且使用ADO.NET可以幾乎跟所有的資料庫打交道。
在這一節,我們不必覆蓋NHibernate API的所有細節,只要知道每一個主要介面的角色就好。我們會逐漸的討論API方法在下一章。你可以找到NHibernate介面的詳細說明在NHibernate的參考文檔。讓我們主要看一下每一個介面把。
2.2.1 介面的核心
有五個核心的介面我們要討論,這五個介面會應用在每一個NHibernate應用程式中。使用這些介面,你可以儲存、檢索持久化類和控制事務。
ISESSION INTERFACE
ISession介面主要被NHibernate應用程式調用。它提供了尋找、儲存、更新和刪除對象的方法。ISession的執行個體是輕量的,建立和銷毀它是不昂貴的。這是非常重要的,因為在你的程式中,你需要經常去建立和銷毀session,或許每個ASP.NET頁面都要這樣做。NHibernate的session不是安全執行緒的,因此每次只可以有一個線程使用。這個將在後面的章節詳細的討論。
NHibernate可以發現持久化類的改變。我們有時叫ISession為持久化管理器,因為它是持久化對象的操作介面,例如儲存、檢索對象。NHibernate的session各ASP.NET的session是完全不同的。當我們使用session在這本書時,是指NHibernate的session。
我們將會討論ISession介面在4.2節。
ISESSIONFACTORY INTERFACE
ISession介面來自於ISessionFactory。對比起ISession介面,這個介面會沒有那麼激動人心。
ISessionFactory不是輕量級的。它是用來在很多的程式線程中共用的。一般整個應用程式只有一個ISessionFactory的執行個體——在程式初始化時建立。但是如果你的程式要訪問多個資料庫,那麼你就需要為每一個資料庫添加一個SessionFactory了。
SessionFactory可以產生SQL和其他NHibernate在運行時使用的元元素。它同樣可以緩衝一些資料以便複用。
CONFIGURATION INTERFACE
Configuration對象是用來配置NHibernate的。應用程式使用一個Configuration執行個體來指定對應檔的位置,和在建立ISessionFactory之前去設定NHibernate的指定屬性。
即使Configuration介面在NHibernate應用程式中只是作用的範圍很少,但是當你使用NHibernate時,它是你首先要接觸的對象。
ITRANSACTION INTERFACE
在Figure2.1中,ITransaction介面就在ISession介面的旁邊。ITransaction介面是可選的。NHibernate程式可以選擇不使用這個介面,而使用一些底層的代碼來管理事務。ITransaction介面是從底層的事務繼承而來的——例如ADO.NET事務或其他類型的事務。
我們會在整本書中使用ITransaction的API。我們將會在第五章討論Transaction和ITransaction介面。
IQUERY AND ICRITERIA INTERFACES
IQuery介面給了你一種非常有效方法去對資料庫進行查詢。Query是用HQL或者資料庫的自然語言SQL來書寫。一個IQury執行個體是輕量級的,我們不可以在ISession之外使用它,因為IQuery是由ISession建立的。它用來綁定查詢的參數,控制返回結果的數量和執行查詢語句。
ICriteria介面類似;它雲系你建立和執行物件導向的查詢。
我們將在第七章討論IQuery介面的特性。現在我已經向你介紹了NHibernate的主要API。下一節,我將介紹一些進階的特性。之後我會介紹怎麼配置NHibernate和怎樣才能看到NHibernate在後台是怎樣執行的。
2.2.2 Callback介面
Callback介面允許程式當對象發生一些事情的時候,程式會收到一個通知。例如,當一個對象載入、儲存或者刪除時,程式會收到一個通知,然後程式會作出一些反應(使用者自訂)。NHibernate應用程式不必應用這些回呼函數,但是在一些特定情況下,它們是非常有用的。
ILifecycle和IValidatable介面允許持久化對象對自身的的一些生命週期的事件發生反應。持久化對象的生命週期包括建立、檢索、更新和刪除。
IInterceptor介面可以讓對象發生回調而不用讓持久化類繼承特定的API,只需要把IInterceptor作為參數傳到持久化類的執行個體即可。我們將在第八章討論。
2.2.3 類型
NHibernate中的類型是非常值得關注的。一個NHibernate的類型匹配一個.NET類型到一個資料庫類型。NHibernate的設計非常的靈活,因為每一個資料庫的類型對應.NET中的類型都是不一樣的,但是NHibernate做到了。
NHibernate包括豐富的內建類型,包括所有.NET的基礎類型和很多CLR類,包括System.DateTime、System.Enum、byte[]、Serializable等等。
而且,NHibernate支援使用者自訂類型。IUserType、ICompositeUserType和IParameterizedType提供了讓你建立自訂的類型。你也可以使用IUserCollectionType來建立自己的集合類型。自訂類型被認為是NHibernate的中心特性。
我們將在6.1節介紹NHibernate的類型和使用者自訂類型。我們現在繼續討論底層介面,你可能不需要使用或明白所有的介面,但是知道他們的存在可以讓你在設計的時候更加靈活。
2.2.4 Extesion介面
大部分的功能都是NHibernate定義好的了。但是當你發現內建的功能不能滿足你的時候,你可以使用Extesion來擴充NHibernate。Extesion介面包括以下幾點:
1、 主鍵產生(IIdentifierGenerator介面)
2、 支援SQL方言(Dialect抽象類別)
3、 緩衝策略(ICache和ICacheProvider介面)
4、 ADO.NET串連管理(IConnectionProvider介面)
5、 交易管理(ITransactionFactory和ITransaction介面)
6、 ORM策略(IClassPersister介面)
7、 屬性存取原則(IPropertyAccessor介面)
8、 代理(IProxyFactory介面)
你不必知道所有的API和介面。我們不需要所有的。例如一個簡單的應用程式,你可能只需要Configuration和ISession介面,如“Hello World”例子那樣。但是在你開始使用NHibernate之前,你應該要明白NHibernate的配置是怎麼樣的,我們將在下一節討論。