天天看點

Abp VNext分表分庫,拒絕手動,我們要happy coding

<code>ShardingCore</code> 易用、簡單、高性能、普适性,是一款擴充針對efcore生态下的分表分庫的擴充解決方案,支援efcore2+的所有版本,支援efcore2+的所有資料庫、支援自定義路由、動态路由、高性能分頁、讀寫分離的一款元件,如果你喜歡這元件或者這個元件對你有幫助請點選下發star讓更多的.neter可以看到使用

Gitee Star 助力dotnet 生态 Github Star

你是否在使用efcore,你是否在使用abp,你是否對目前的分表十分厭惡,手動指定表讓你的代碼無辜多出很多膠水代碼,那麼這次的文章可以很好的幫你解決掉目前的困難點,sharding-core 針對efcore的分庫分表讀寫分離的痛點進行擴充,可以完美內建到efcore生态的系統裡面,無論你是abp還是其他使用efcore的架構,你确定真的不看一下嗎,如何內建abp當時我釋出這個庫的時候就有很多人問我是否支援,我的回答是支援的,隻是個人沒有時間去實作。這次已經實作了我這邊将分享下如何內建<code>sharding-core</code>到<code>abp vnext</code>中。

距離上一篇部落格已經兩周了,在這兩周期間本人還是做了很多事情,針對優化<code>sharding-core</code>的使用和體驗,就在上周五傍晚的時候有個使用abp的同學聯系我,問我什麼時候支援abp vnext,其實這個計劃我很早之前就在issue裡面備注了,隻是擷取用abp的同學沒有怎麼關注這個類庫也沒人提出來,是以就擱置了。因為sharding-core是一款幾乎可以說可以內建到任何efcore生态下的是以原則上abp上內建應該是沒什麼難度的,因為本人使用abp不是很多是以這邊自己按官方教程進行了初步的項目搭建,然後又用了一會功夫了解了abp源碼(之前有了解過)清楚了dbcontext的建立過程是以很快就繼承好了一個todoapp

接下來我将用一篇部落格的篇幅來介紹如何将<code>sharing-core</code>內建到<code>abp vnext</code>中。

我這邊是通過github進行了例子的todoapp 進行下載下傳,下載下傳後是一個集合例子,我們擷取TodoApp項目進行單獨處理,打開然後編譯。

注意如果你自己會建立那麼也是一樣的

abp:隻要你的dbcontext繼承至 <code>public class TDbContext:AbpDbContext&lt;TDbContext&gt;</code>那麼就可以完美使用.

但是sharding-core的使用我們通過readme來檢視發現

sharidng-core:隻要你的dbcontext繼承至<code>public class TDbContext:AbstractShardingDbContext</code>那麼你就可以完美使用.

好家夥直接給想自己內建的同學搞蒙蔽了,c#又不是c艹沒有多繼承啊那怎麼辦,但是這邊其實是有一個誤區的就是abp确實需要繼承abpdbcontext但是sharding-core是已接口作為依賴來開發的,是以我們隻需要實作<code>ISharingDbContext</code> 這個接口就可以了如果需要事務在實作<code>ISupportShardingTransaction</code>

最終我們是通過實作一個抽象基類來繼承abpdbcntext并且實作sharding-core需要的接口 AbstractShardingAbpDbContext 這樣我們就可以在不破壞abp的同時又兼顧了sharding-core

注意:這邊sharing-core讓你們繼承AbstractShardingDbContext是因為重複寫這些接口的實作會很麻煩是以給你們寫了一個抽象友善你們使用

Abp VNext分表分庫,拒絕手動,我們要happy coding

通過源碼可以看出abp內建需要指派lazyserviceprovider 因為abp的dbcontext是交由uow自己處理并且需要支援很多特性是以我們在建立dbcontext的時候需要對此處進行指派注意點。

注意abp預設提供了<code>IEntity&lt;Guid&gt;</code>,<code>IHasCreationTime</code>屬性較為常用是以我們需要注意如何支援這兩種,因為當你用id取模分表或者建立時間分表的使用場景還是比較常見的是以我們需要支援。

因為在insert時如果sharding-core發現對應的分表字段為null就無法繼續執行下去,是以為了相容abp需要支援兩個比較常見的需求

Abp VNext分表分庫,拒絕手動,我們要happy coding
Abp VNext分表分庫,拒絕手動,我們要happy coding

首先我們需要知道sharding-core是如何對一個普通的dbcontext進行支援的

如果你的dbcontext有用到以下任意一個接口那麼內建起來可能需要自己去實作對應的接口

IDbSetSource 用來接管dbset

IQueryCompiler 用來接管查詢編譯

IDbContextTransactionManager 用來接管事務開啟

IRelationalTransactionFactory 用來接管事務的送出、復原 和加入

IModelCacheKeyFactory 用來接管dbcontext的模型緩存

IModelCustomizer 用來接管dbcontext的模型初始化前後自定義

如果你的efcore想接入sharding-core并且如果你沒有對dbcontext的上述任何接口進行替換那麼可以很容易就接入,如果你的efcore在建立的時候有針對上述的接口進行替換,就需要你自己手動進行兩邊的實作合并。

這邊我們假設你沒有對上述的dbcontextoptionbuilder的建立進行接口的替換那麼你隻需要進行如下操作就可以簡單接入sharding-core

首先就是預設建立dbcontext替換為sharding-core的配置

原先:

現在:

綜上所述我們接入任何efcore的系統隻需要進行4步(第一步都可以去掉隻需要3步)就可以完美接入了,可以保證使用

修改将todoitem表作為id取模來進行分表示範

預設TodoApp有一個TodoItem實體對象我們首先建立兩個空接口

建立TodoItem的分表路由

通過繼承預設分表取模路由<code>AbstractSimpleShardingModKeyStringVirtualTableRoute</code>

實作 AbstractShardingAbpDbContext

其中别的接口都和sharding-core一緻,為了支援abp的部分自動屬性這邊進行了新的接口添加用來辨別目前的對象是通過什麼方式來進行分表的,然後可以高效的通過接口來進行指派,比如<code>IShardingKeyIsGuId</code>告訴系統是id為guid的進行分表的

既然你講TodoItem進行了分表,那麼你這邊需要告訴系統你是按怎麼個規則進行分表的,假設我們預設按id取模那麼可以繼承sharding-core預設提供的取模路由

簡單說明就是分表字尾為2位數00-99,5代表模5也就是00,01,02,03,04

<code>builder.ShardingProperty(o =&gt; o.Id);</code>告訴架構通過<code>Id</code>字段分表

注意: <code>IShardingTableDbContext</code>如果dbcontext需要實作分表功能必須實作<code>IShardingTableDbContext</code>

到目前為止我們的準備工作已經完成了,接下來需要進行codefirst的支援和具體項目的配置使用了

選中<code>TodoApp.EntityFrameworkCore</code>項目打開<code>TodoAppDbContextFactory</code>替換dbcontext的建立方法,主要是替換codefirst的建表語句

這邊是采用了<code>EFCore.Sharding</code>

主要代碼就是告訴efcore.tools如何建立對應的dbcontext

然後打開nuget控制台

Abp VNext分表分庫,拒絕手動,我們要happy coding

選中需要生成遷移的項目

Abp VNext分表分庫,拒絕手動,我們要happy coding

啟動項設定為

Abp VNext分表分庫,拒絕手動,我們要happy coding

執行指令

Abp VNext分表分庫,拒絕手動,我們要happy coding
Abp VNext分表分庫,拒絕手動,我們要happy coding

到此為止我們的code first已經完成了,系統會自動根據分表的配置來進行建立對應的sql語句

因為<code>sharding-core</code>是基于接口和dbcontext是以隻要你的efcore那麼基本上你的生态就可以接入<code>sharding-core</code>,主要就是注意1點

自定義替換DbContextOptions的部分服務

dbcontext的構造函數是DbContextOptions或者是他的泛型類

稍微解釋下

用來告訴abp,TodoAppDbContext的建立需要使用useSharding,

之後就是<code>sharding-core</code>預設提供的builder,當然你們可以自行封裝一下,别忘了在啟動的時候

這個千萬不能忘

Abp VNext分表分庫,拒絕手動,我們要happy coding

通過添加efcore的日志我們可以清晰地看到abp能夠正确的将對應的資料插入進去,并且完全不需要修改現有代碼,基本上的零基礎使用,簡單的配置,

如果您喜歡本庫就點點star點點贊,來都來了點個推薦不過分吧。為.net生态做一份貢獻,希望各位個多多提issue,和pr十分感激

AbpVNextShardingTodoApp

Github ShardingCore

Gitee ShardingCore

部落格

QQ群:771630778

個人QQ:326308290(歡迎技術支援提供您寶貴的意見)

個人郵箱:[email protected]

EFCore.Sharding的遷移思路

繼續閱讀