詳解在.net core中完美解決多租戶(hù)分庫(kù)分表的問(wèn)題
前幾天有人想做一個(gè)多租戶(hù)的平臺(tái),每個(gè)租戶(hù)一個(gè)庫(kù),可以進(jìn)行水平擴(kuò)展,應(yīng)用端根據(jù)登錄信息,切換到不同的租戶(hù)庫(kù)
計(jì)劃用ef core實(shí)現(xiàn),他們說(shuō)做不出來(lái),需要?jiǎng)討B(tài)創(chuàng)建dbContext,不好實(shí)現(xiàn)
然而這個(gè)使用CRL很輕松就能解決了
以下為演示數(shù)據(jù)庫(kù),有兩個(gè)庫(kù)testdb和testdb2,查詢(xún)結(jié)果如下


目標(biāo):
根據(jù)傳入登錄信息連不不同的庫(kù),查詢(xún)返回結(jié)果,如登錄人為01,返回d1.default,登錄人為02 返回 d2.default
實(shí)際上這個(gè)需求就是分庫(kù)分表的實(shí)現(xiàn),通過(guò)設(shè)置數(shù)據(jù)庫(kù)/表映射關(guān)系,根據(jù)傳入的定位數(shù)據(jù)進(jìn)行匹配,找到正確的庫(kù)表配置,生成數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象
以core控制臺(tái)程序?yàn)槔?/p>
class Program
{
static IServiceProvider provider;
static Program()
{
var services = new ServiceCollection();
services.AddCRL<DBLocationCreator>();
services.AddScoped<Code.Sharding.MemberManage>();
provider = services.BuildServiceProvider();
provider.UseCRL();
}
static void Main(string[] args)
{
label1:
var instance = provider.GetService<Code.Sharding.MemberManage>();
var data = new Code.Sharding.MemberSharding();
data.Code = "01";
instance.SetLocation(data);
var find1 = instance.QueryItem(b => b.Id > 0)?.Name;
Console.WriteLine($"定位數(shù)據(jù)輸入{data.Code},查詢(xún)值為{find1}");
data.Code = "02";
instance.SetLocation(data);
var find2 = instance.QueryItem(b => b.Id > 0)?.Name;
Console.WriteLine($"定位數(shù)據(jù)輸入{data.Code},查詢(xún)值為{find2}");
Console.ReadLine();
goto label1;
}
}
上面代碼中,通過(guò)SetLocation方法傳入定位數(shù)據(jù)Code,通過(guò)QueryItem方法查詢(xún)出數(shù)據(jù)并打印出來(lái)
通過(guò)services.AddCRL<DBLocationCreator>()注入定位配置,DBLocationCreator繼承了接口IDBLocationCreator
這里完全符合core注入規(guī)范,可以通過(guò)配置或數(shù)據(jù)庫(kù)存儲(chǔ)動(dòng)態(tài)讀取定位設(shè)置
public class DBLocationCreator : IDBLocationCreator
{
ISettingConfigBuilder _settingConfigBuilder;
public DBLocationCreator(ISettingConfigBuilder settingConfigBuilder)
{
_settingConfigBuilder = settingConfigBuilder;
}
public void Init()
{
//自定義定位
_settingConfigBuilder.RegisterLocation<Code.Sharding.MemberSharding>((t, a) =>
{
var tableName = t.TableName;
var dbName = a.Code == "02" ? "testdb2" : "testdb";
var dataBase = $"Data Source=.;Initial Catalog={dbName};User ID=sa;Password=123";
//返回定位庫(kù)和表名
return new CRL.Sharding.Location(dataBase, tableName);
});
_settingConfigBuilder.RegisterDBAccessBuild(dbLocation =>
{
var connectionString = "Data Source=.;Initial Catalog=testdb;User ID=sa;Password=123";
if (dbLocation.ShardingLocation != null)
{
connectionString = dbLocation.ShardingLocation.DataBaseSource;
}
return new CRL.DBAccessBuild(DBType.MSSQL, connectionString);
});
}
}
在Init方法里,實(shí)現(xiàn)了兩個(gè)操作,通過(guò)RegisterLocation定義如何根據(jù)定位數(shù)據(jù)Code,返回不同的庫(kù)/表
通過(guò)RegisterDBAccessBuild實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)
運(yùn)行測(cè)試程序,結(jié)果輸出為

上面代碼通過(guò)自定義定位參數(shù)和定位規(guī)則,沒(méi)有任何耦合,調(diào)用也很簡(jiǎn)單,完美達(dá)到了預(yù)期效果
測(cè)試代碼地址:https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest
到此這篇關(guān)于詳解在.net core中完美解決多租戶(hù)分庫(kù)分表的問(wèn)題的文章就介紹到這了,更多相關(guān).net core多租戶(hù)分庫(kù)分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET 6開(kāi)發(fā)TodoList應(yīng)用之實(shí)現(xiàn)ActionFilter
Filter在.NET Web API項(xiàng)目開(kāi)發(fā)中也是很重要的一個(gè)概念,它運(yùn)行在執(zhí)行MVC響應(yīng)的Pipeline中執(zhí)行,允許我們將一些可以在多個(gè)Action之間重用的邏輯抽取出來(lái)集中管理。本文將詳細(xì)介紹一下.NET 6如何實(shí)現(xiàn)ActionFilter,感興趣的可以學(xué)習(xí)一下2021-12-12
ASP.NET Mvc開(kāi)發(fā)之刪除修改數(shù)據(jù)
這篇文章主要介紹了ASP.NET Mvc開(kāi)發(fā)中的刪除修改數(shù)據(jù)功能,感興趣的小伙伴們可以參考一下2016-03-03
.NET實(shí)現(xiàn)ChatGPT的Stream傳輸?shù)倪^(guò)程
這篇文章主要介紹了.NET如何實(shí)現(xiàn)ChatGPT的Stream傳輸,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
GridView自動(dòng)增加序號(hào)(三種實(shí)現(xiàn)方式)
第一種方式,直接在Aspx頁(yè)面GridView模板列中.這種的缺點(diǎn)是到第二頁(yè)分頁(yè)時(shí)又重新開(kāi)始了,第二種方式分頁(yè)時(shí)進(jìn)行了計(jì)算,這樣會(huì)累計(jì)向下加,點(diǎn)三種放在cs代碼中2013-04-04
.net調(diào)用存儲(chǔ)過(guò)程詳細(xì)介紹
本文的數(shù)據(jù)庫(kù)用的是sql server自帶數(shù)據(jù)Northwind2013-04-04
asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法,結(jié)合實(shí)例形式分析了asp.net文本框Enter響應(yīng)的原理與取消Enter響應(yīng)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11

