中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決在.net core中完美解決多租戶分庫分表

發布時間:2021-03-08 17:02:57 來源:億速云 閱讀:185 作者:TREX 欄目:開發技術

本篇內容主要講解“如何解決在.net core中完美解決多租戶分庫分表”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何解決在.net core中完美解決多租戶分庫分表”吧!

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

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

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

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

如何解決在.net core中完美解決多租戶分庫分表

如何解決在.net core中完美解決多租戶分庫分表

目標:

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

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

以core控制臺程序為例

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注入規范,可以通過配置或數據庫存儲動態讀取定位設置

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中完美解決多租戶分庫分表

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

到此,相信大家對“如何解決在.net core中完美解決多租戶分庫分表”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永宁县| 陆良县| 信丰县| 新疆| 定襄县| 茌平县| 九台市| 安西县| 固镇县| 平乡县| 定边县| 绥滨县| 神木县| 尖扎县| 呼伦贝尔市| 新竹县| 安新县| 德清县| 南乐县| 黄大仙区| 崇阳县| 大港区| 德钦县| 崇信县| 客服| 读书| 海城市| 射阳县| 朔州市| 霍州市| 金昌市| 临泽县| 永新县| 文化| 蒙自县| 天长市| 霍林郭勒市| 中西区| 黔西县| 资源县| 监利县|