輕量級ORM-PetaPoco及改進

來源:互聯網
上載者:User

      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.       程式碼片段:     
  2.      在相對較為複雜的業務系統中,可能存在多個資料庫,例如:UserDB,ProductDB,OrderDB等。且存在UserDB資料量較大,需要上Oracle資料庫,而其他資料庫有可能是SqlServer或MySql;
  3.      即一個業務系統中,存在多個資料庫,多種資料庫。
  4.      面對這樣的業務系統時,我們需要對資料層進行較好地封裝,而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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.