開源Dapper的Lambda擴展-Sikiro.Dapper.Extension V2.0 封裝本身的dapper lambda擴展-設計篇

前言

  去年我在業餘時間,本身整了一套dapper的lambda表達式的封裝,本來是做爲了一個我的的娛樂項目,當時也只支持了Sql Server數據庫。隨之開源後,有很多朋友也對此作了試用,也對我這個項目提出了很多的建議。所以我在最近公司業務不怎麼繁忙的狀況下,對朋友們的建議和個人想法作了一個總結,而後花了一個星期的時間對項目進行了重構與升級,但願該項目能幫助到有須要的人。html

  若是您對它有興趣,歡迎你們提交Pull Request代碼變動,若是有任何問題可提交issue進行討論。固然也能夠在下方評論和QQ私聊給我。爲該文章點個推薦或者給項目點star都是給我最大的動力與支持,謝謝。git

源碼

https://github.com/SkyChenSky/Sikiro.Dapper.Extensiongithub

文檔

具體使用能夠查看文檔:數據庫

https://github.com/SkyChenSky/Sikiro.Dapper.Extension/wiki服務器

設計理念

該項目主要目的是經過使用lambda表達式達到如下效果:併發

  • 提升開發效率
  • 強類型。
  • 智能提示
  • 編譯錯誤提示

  該擴展主要解決重複性較大的簡單查詢,所以並不提供鏈表(JOIN)操做,若是是簡單的鏈表能夠經過編寫視圖,再使用該擴展組件。若是是複雜查詢,建議手寫SQL+原生Dapper方法。app

版本改動

數據庫支持

  本來項目名爲Sikiro.DapperLambdaExtension.MsSql,現改名爲Sikiro.Dapper.Extension,同時支持三種數據庫 MsSQL、MySQL、PostgreSQL。框架

MsSql

PM> Install-Package Sikiro.Dapper.Extension.MsSql

MySql

PM> Install-Package Sikiro.Dapper.Extension.MySql

PostgreSql

PM> Install-Package Sikiro.Dapper.Extension.PostgreSql

異步方法支持

  對於數據庫訪問這種強I/O操做的,能夠在合理的場景下使用異步方法提升應用處理併發能力。支持方法有:異步

  1. ToListAsync
  2. GetAsync
  3. InsertAsync
  4. DeleteAsync
  5. UpdateSelectAsync
  6. UpdateAsync

框架重構

框架主要分爲兩部分:高併發

Sikiro.Dapper.Extension 爲公共抽象庫,主要是接口、抽象類與公共方法

Sikiro.Dapper.Extension.XXX 爲具體實現庫,主要是重寫不一樣數據庫的特性與語句組合。

Sikiro.Dapper.Extension 類圖

Sikiro.Dapper.Extension.MsSql類圖

其餘特性

鏈式風格

Query

con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com")
                       .OrderBy(a => a.CreateDatetime)
                       .Select(a => new SysUser { Email = a.Email, CreateDatetime = a.CreateDatetime, SysUserid = a.SysUserid })
                       .PageList(1, 10);

 Command

con.CommandSet<SysUser>().Where(a => a.Email == "287245177@qq.com").Update(a => new SysUser { Email = "123456789@qq.com" });

 

忠於原生的特性標籤

不標新立異,方便替換組件

[Table("SYS_USER")]

[Key]

[Required]

[StringLength(32)]

[Display(Name = "主鍵")]

[Column("SYS_USERID")]

[DatabaseGenerated]

 

高併發處理的UpdateSelect

   該方法主要用於把符合條件的數據更新後並查詢出來,並經過READPAST過濾了已被鎖的數據。具體所生成的SQL語句以下:

UPDATE TOP ( 100 )
        SYS_USER WITH ( UPDLOCK, READPAST )
SET     USER_STATUS = 1
OUTPUT  INSERTED.[USER_NAME] ,
        INSERTED.SYS_USERID ,
        INSERTED.EMAIL
FROM    SYS_USER
WHERE   CREATE_DATETIME < '2018-09-13'
        AND USER_STATUS = 2;

  那麼該方法有他的使用場景,在咱們公司現有業務,資金定時服務就是經過使用UpdateSelect方法輪詢數據源,把須要處理的數據庫先UpdateSelect成一箇中間狀態,而後再與第三方接口作交互處理,假如此時有多個資金定時服務並行去跑,A-Job會跑取前100條數據,B-Job會由於READPAST的緣由過濾了A-JOB所鎖的前1-100條而讀取了第101-200條數據進行處理。所以當業務量增多,只須要把資金定時服務再部署多一臺服務器便可。

附帶工具

2年前也是在業餘時間,本身基於Visual Studio SDK寫了一個實體成的VS 插件。本工具也是開源的,並很好與Sikiro.Dapper.Extension配合使用,固然也是非必要的可獨立使用。

github地址:https://github.com/SkyChenSky/AutoBuildEntity

其餘

  若是也想開發相似項目的朋友,也能夠參考我之前寫過的三篇文章:

相關文章
相關標籤/搜索