一個概念只有將其放到一個具體的上下文中,其含義和作用才會清晰、明確。脫離了上下文,概念就失去了其價值和生命力。所以,學習使用任何技術或概念的時候,有一件事情是非常重要的,那就是透徹地理解該技術概念所位於的上下文,這將有助於我們更好地使用和駕馭這個技術。
在ORM流行的今天,資料訪問架構層出不窮,但是這些架構所基於的上下文幾乎都會有些不一樣,要想將一個資料訪問架構運用得爐火純青,必須要掌握該架構所基於的上下文。同理,如果你想發揮DataRabbit架構的巨大威力,在之前,你絕對有必要瞭解一下DataRbbit的上下文。
一.純ORM ?
在DataRabbit發展過程中,我曾作了一個非常重要的決定:不能把DataRabbit定位為一個純粹的ORM架構,即所有的資料訪問功能都基於ORM來實現。原因很簡單,ORM並不能完成所有的事情(即使能完成所有的事情,那麼也需要花費巨大的代價),有些資料庫訪問還是需要基於關係來進行,對於那些不提供基於關係進行資料訪問操作的純ORM架構,我認為其決策是不明智的。所以,在DataRabbit中,基於ORM的資料訪問和基於關係的資料訪問各佔了一半的天空,這使得我們在無法用ORM達成或很難使用ORM達成的地方,可以轉向使用基於關係的訪問器來達成。
除了核心的ORM訪問器和基於關係的訪問器來訪問資料表中的資料外,DataRabbit還提供對資料表的“大綱”進行訪問和操作的功能,這是因為我們經常有這樣的需求:擷取資料表的某個欄位的資訊、或找到主外鍵關係、或者需要動態建立一個具有指定大綱的資料表。目前版本的DataRabbit提供的大綱操作功能還比較單薄,以後會逐漸進行增強。
二.DataRabbit中的核心理念
1.輕量、弱侵入性。比如,DataRabbit對你的資料庫設計沒有任何要求(而有的資料訪問架構可能要求資料表必須有唯一主鍵)。
2.約定優於配置。使用DataRabbit不需要任何配置,這使得DataRabbit更加易用。
3.資料庫類型無關性。統一的資料提供者屏蔽了資料庫類型的差異,目前版本的DataRabbit內建了對SqlServer和Oracle的支援,可以通過外掛程式的方式來支援其它類型的資料庫。
4.DataRabbit中的所有資料訪問功能都是由各種訪問器(如IOrmAccesser、IRelationAccesser、ITableAccesser、IDataSchemaAccesser、IEntityRelationLoader、ISPAccesser)來提供的。
5.所有的訪問器介面的引用都可以從DataRabbit的根(“Root”)獲得,在DataRabbit中,這樣的根有兩個,一個是IDataAccesser介面,另一個是TransactionScope。
6.一個根(“Root”)執行個體就對應著一個資料庫。也可以這麼說,針對一個特定的資料庫,我們的應用只需要維護一個DataRabbit Root即可。
7. DataRabbit提供的所有的訪問器(如IOrmAccesser)都可以在兩種環境中工作:事務環境和非事務環境。這是由所有的訪問器都繼承了的ItransactionAccesser這個介面體現出來的。
8.任何一個訪問器執行個體,如果在非事務環境中工作,那麼它就是無狀態的,DataRabbit將以Singleton的模式提供它的執行個體;如果訪問器執行個體工作於事務環境中,那麼它就是有狀態的,並且它的生命期將隨事務的結束而結束,DataRabbit以“Single Call”的模式提供它的執行個體。
三.DataRabbit中的ORM理念
DataRabbit所採用的ORM理念非常單純、簡單,其主要特點如下:
1.ORM僅僅對單表進行操作,不支援多表聯合訪問。對於多表聯合訪問的ORM解決方案,我還沒有一個好的主意。
2.資料庫中的一個資料表Table就對應著一個Entity Class定義,它們之間是一對一的映射關係。
(1) 為了省去不必要的麻煩,Entity Class的類名最好與對應的Table的名字完全一致。這樣DataRabbit可以方便地根據Entity Class的名字找到資料庫中對應的表,或者反過來。
(2) Table中的每個列對應著Entity Class中的一個屬性,列和屬性的名字要求完全一致,並且,它們的類型是匹配的。
(3) Table中的一條記錄就對應著一個Entity Object。
3.ORM資料訪問操作的定義不是位於Entity Class中,而是定義於專門的ORM訪問器(IOrmAccesser)中。從這個意義上來說,Entity Class更像是一個僅僅封裝了資料的結構,而不是一個類。
4.ORM訪問器採用泛型和反射技術實現,這樣,DataRabbit只需要提供一個ORM訪問器類,便可以對資料庫中的所有表進行ORM訪問。
5.ORM訪問器通過泛型參數來標誌要訪問哪個表。泛型參數還有一個好處是,所有的ORM訪問操作都是強型別的。
6.使用Filter來表示單個的查詢條件。ORM的一個非常重要的目的,就是屏蔽所有的SQL語句,所以Sql條件子句也需要被抽象建模。
7.使用IFilterTree介面來抽象複雜的多個查詢條件的組合。
四、DataRabbit對N層架構提供支援
DataRabbit在設計實現的時候,就考慮了如何更好的支援系統架構,所以,DataRabbit可以非常平滑無縫地融合到3層/N層架構中。關於這方面的詳細介紹可參見:DataRabbit 輕量的資料訪問架構(12)-- 將DataRabbit融入架構