一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 詳解在.net core中完美解決多租戶分庫分表的問題

詳解在.net core中完美解決多租戶分庫分表的問題

2020-06-29 14:29hubro ASP.NET教程

這篇文章主要介紹了詳解在.net core中完美解決多租戶分庫分表的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前幾天有人想做一個多租戶的平臺,每個租戶一個庫,可以進行水平擴展,應用端根據登錄信息,切換到不同的租戶庫

計劃用ef core實現,他們說做不出來,需要動態創建dbContext,不好實現

然而這個使用CRL很輕松就能解決了

以下為演示數據庫,有兩個庫testdb和testdb2,查詢結果如下

詳解在.net core中完美解決多租戶分庫分表的問題

詳解在.net core中完美解決多租戶分庫分表的問題

目標:

根據傳入登錄信息連不不同的庫,查詢返回結果,如登錄人為01,返回d1.default,登錄人為02 返回 d2.default

實際上這個需求就是分庫分表的實現,通過設置數據庫/表映射關系,根據傳入的定位數據進行匹配,找到正確的庫表配置,生成數據訪問對象

以core控制臺程序為例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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($"定位數據輸入{data.Code},查詢值為{find1}");
 
      data.Code = "02";
      instance.SetLocation(data);
      var find2 = instance.QueryItem(b => b.Id > 0)?.Name;
      Console.WriteLine($"定位數據輸入{data.Code},查詢值為{find2}");
      Console.ReadLine();
      goto label1;
    }
  }

上面代碼中,通過SetLocation方法傳入定位數據Code,通過QueryItem方法查詢出數據并打印出來

通過services.AddCRL<DBLocationCreator>()注入定位配置,DBLocationCreator繼承了接口IDBLocationCreator

這里完全符合core注入規范,可以通過配置或數據庫存儲動態讀取定位設置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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";
        //返回定位庫和表名
        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方法里,實現了兩個操作,通過RegisterLocation定義如何根據定位數據Code,返回不同的庫/表

通過RegisterDBAccessBuild實現數據訪問

運行測試程序,結果輸出為

詳解在.net core中完美解決多租戶分庫分表的問題

上面代碼通過自定義定位參數和定位規則,沒有任何耦合,調用也很簡單,完美達到了預期效果

測試代碼地址:https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest

到此這篇關于詳解在.net core中完美解決多租戶分庫分表的問題的文章就介紹到這了,更多相關.net core多租戶分庫分表內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/hubro/p/12693868.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美日韩免费一区二区 | 2022超帅男同gayxxx| 糖心视频在线观看 | 91香蕉官网| 91久久色 | 大香人蕉免费视频75 | 国产91精品久久久久久 | 91在线亚洲综合在线 | 免费亚洲视频在线观看 | 美女跪式抽搐gif动态图 | 国产实拍会所女技师在线 | 国产a免费观看 | 精品国产精品国产 | 性xxxx中国老妇506070 | 国产一级片视频 | 天使萌痴汉在线中文字幕 | 天堂激情网| 亚洲精品青青草原avav久久qv | 欧美性bbbbbxxxxxddd| 日韩精品视频美在线精品视频 | 草草视频免费看 | 亚洲精品成人a | 91精品综合久久久久久五月天 | 久久sese | 草啪啪| 毛片在线免费观看网站 | 嫩模被黑人粗大挺进 | 干露露视频 性感写真 | 色婷婷天天综合在线 | 天天成人 | 日韩视频一区二区三区 | 亚洲国产在线播放在线 | 国产欧美又粗又猛又爽老 | 欧美黑人性猛交╳xx╳动态图 | 9420高清视频在线观看网百度 | 国内精品一区二区在线观看 | 羞羞影院午夜男女爽爽影院网站 | 特色特色大片在线 | 亚洲精品在线看 | 亚洲精品中文字幕久久久久久 | 亚洲视频免费在线看 |