PetaPoco描述
PetaPoco是一個微小的,快速的,單個檔案的微型ORM,可以運行在.NET和Mono平台上。相對於NHibernate與Entity Framework,PetaPoco有以下幾點非常吸引我:
- 1. 輕量級,高效能;
- 2. 可同時運行在.net與mono平台上;
- 3. 支援多種資料庫,且按其提供的規範編寫組裝SQL,切換資料庫時,基本上不需要修改代碼;
- 4. SqlBuilder高效快捷方便;
- PetaPoco地址:http://www.toptensoftware.com/petapoco/
- 如何使用PetaPoco,PetaPoco有非常詳細的使用指南,園子裡面也有同學翻譯了:傳送門
- 下面,主要分享一下我對它的一些小改造
-
PetaPocoRepository 倉儲基類
- PetaPocoRepository主要通過一個泛型倉儲基類來封裝PetaPoco的大多數資料操作。簡化業務對象倉儲操作類的開發。
- 主要有以下操作:
Add,Delete,Update,Save,FirstOrDefault(擷取一條),Query(擷取列表),PagedList(擷取分頁)等。
- 程式碼片段:
- 在相對較為複雜的業務系統中,可能存在多個資料庫,例如:UserDB,ProductDB,OrderDB等。且存在UserDB資料量較大,需要上Oracle資料庫,而其他資料庫有可能是SqlServer或MySql;
- 即一個業務系統中,存在多個資料庫,多種資料庫。
- 面對這樣的業務系統時,我們需要對資料層進行較好地封裝,而PetaPoco的Sql Builder無縫相容多種資料庫能很好地解決異構資料庫的問題。因此,我們只需要解決多個資料庫帶來的編碼困難。
SingleRepository 單個資料庫模式的倉儲基類
系統中存在多個資料庫時,如果我們使用SqlHelper類似的組件來進行編碼時,可能不是很優雅,類似於:
其實,我們可以通過封裝一個基類,通過某個特性來說明此業務對象倉儲操作類對應的是哪個資料庫。它有以下需求:
1. 最好能繼承PetaPocoRepository,得到其所有通用性的資料操作方法;
2. 特性來描述該對象操作的是哪個資料庫;
OK,直接:
SingleDbFactory
SingleRepository<T>
使用
樣本環境:
1. 存在2個資料庫:TestDB(SqlServer),Test(MySql);
2. TestDB(SqlServer)中存在2個表UserInfo,ProductId,Test(MySql)中存在表UserInfo
3. 資料庫連接字串
<add name="SqlServerDB" connectionString="Server=.\SqlExpress;Database=TestDB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
<add name="MySqlDB" connectionString="Server=127.0.0.1;Database=Test;Uid=root;Pwd=123456;" providerName="MySql.Data.MySqlClient"/>
4. 倉儲類
5. 類圖
通過SingleDbFactory特性的描述,即可較為優雅地實現資料操作類對應不同資料庫。
MySql / SqlServer 多種資料庫的支援
上面的樣本中,TestDB(SqlServer)及Test(MySql)中都存在表UserInfo。當我們從SqlServer切換至MySql時,只需要UserInfoRepository中的SQL語句使用SqlBuilder類來進行規範的組裝,完全可以無縫相容。(只需要修改SingleDbFactory即可,在本文最後會附上範例程式碼。)
需要探討的問題
1. 當某個業務對象在一個資料庫內進行表水平分割時,組件需要如何應對。這個想了很久,最開始,我也想通過一個SingleSharddingRepository來實現。碰到了一些困難,如:
Shardding時的規則多樣化,怎樣通過代碼注入的方式來定義規則;
大量使用反射或AOP時,效能會不會有影響;
2. 當某個業務對象進行資料庫層級的水平分割時,組件需要如何應對。
非常希望園子裡的高手給出較好的建議
DEMO:http://files.cnblogs.com/bagegejin/PetaPocoDemo.rar