輕量級ORM-PetaPoco及改進


      PetaPoco描述

      PetaPoco是一個微小的,快速的,單個文件的微型ORM,可以運行在.NET和Mono平台上。相對於NHibernate與Entity Framework,PetaPoco有以下幾點非常吸引我:

  1.           1. 輕量級,高性能;
  2.           2. 可同時運行在.net與mono平台上;
  3.           3. 支持多種數據庫,且按其提供的規范編寫組裝SQL,切換數據庫時,基本上不需要修改代碼;
  4.           4. SqlBuilder高效快捷方便;
  5.      PetaPoco地址:http://www.toptensoftware.com/petapoco/
  6.      如何使用PetaPoco,PetaPoco有非常詳細的使用指南,園子里面也有同學翻譯了:傳送門
  7.      下面,主要分享一下我對它的一些小改造
  8.    

   PetaPocoRepository 倉儲基類 

  1.       PetaPocoRepository主要通過一個泛型倉儲基類來封裝PetaPoco的大多數數據操作。簡化業務對象倉儲操作類的開發。
  2.       主要有以下操作:

             Add,Delete,Update,Save,FirstOrDefault(獲取一條),Query(獲取列表),PagedList(獲取分頁)等。

  1.       代碼片段:      image
  2.      在相對較為復雜的業務系統中,可能存在多個數據庫,例如:UserDB,ProductDB,OrderDB等。且存在UserDB數據量較大,需要上Oracle數據庫,而其他數據庫有可能是SqlServer或MySql;
  3.      即一個業務系統中,存在多個數據庫,多種數據庫。
  4.      面對這樣的業務系統時,我們需要對數據層進行較好地封裝,而PetaPoco的Sql Builder無縫兼容多種數據庫能很好地解決異構數據庫的問題。因此,我們只需要解決多個數據庫帶來的編碼困難。

SingleRepository 單個數據庫模式的倉儲基類

     系統中存在多個數據庫時,如果我們使用SqlHelper類似的組件來進行編碼時,可能不是很優雅,類似於:      image

    其實,我們可以通過封裝一個基類,通過某個特性來說明此業務對象倉儲操作類對應的是哪個數據庫。它有以下需求:

      1. 最好能繼承PetaPocoRepository,得到其所有通用性的數據操作方法;

      2. 特性來描述該對象操作的是哪個數據庫;

    OK,直接上圖:

    SingleDbFactoryimage

      SingleRepository<T>image

 

   使用

     示例環境:

        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. 倉儲類      imageimage

      5. 類圖

image

     通過SingleDbFactory特性的描述,即可較為優雅地實現數據操作類對應不同數據庫。

 

MySql / SqlServer 多種數據庫的支持

    上面的示例中,TestDB(SqlServer)及Test(MySql)中都存在表UserInfo。當我們從SqlServer切換至MySql時,只需要UserInfoRepository中的SQL語句使用SqlBuilder類來進行規范的組裝,完全可以無縫兼容。(只需要修改SingleDbFactory即可,在本文最后會附上示例代碼。)

image

需要探討的問題

    1. 當某個業務對象在一個數據庫內進行表水平拆分時,組件需要如何應對。這個想了很久,最開始,我也想通過一個SingleSharddingRepository來實現。碰到了一些困難,如:

                    Shardding時的規則多樣化,怎樣通過代碼注入的方式來定義規則;         

                    大量使用反射或AOP時,性能會不會有影響;

    2. 當某個業務對象進行數據庫級別的水平拆分時,組件需要如何應對。  

    非常希望園子里的高手給出較好的建議

 

DEMO下載地址:http://files.cnblogs.com/bagegejin/PetaPocoDemo.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM