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,直接上圖:
使用
示例環境:
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"/>
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