如何解决在。net核心中完美解决多租户分库分表

  介绍

本篇内容主要讲解”如何解决在。net核心中完美解决多租户分库分表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习”如何解决在。net核心中完美解决多租户分库分表”吧!

前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库

计划用ef核心实现,他们说做不出来,需要动态创建dbContext,不好实现

然而这个使用CRL很轻松就能解决了

以下为演示数据库,有两个库和testdb testdb2,查询结果如下

如何解决在。net核心中完美解决多租户分库分表

如何解决在。net核心中完美解决多租户分库分表

<强>目标:

根据传入登录信息连不不同的库,查询返回结果,如登录人为01,返回d1.default,登录人为02返回d2.default

实际上这个需求就是分库分表的实现,通过设置数据库/表映射关系,根据传入的定位数据进行匹配,找到正确的库表配置,生成数据访问对象

以核心控制台程序为例

class 程序   {才能   ,,,static  IServiceProvider 供应商;   ,,,static 程序()   ,,,{   ,,,,,var  services =, new  ServiceCollection ();   ,,,,,services.AddCRL ();   ,,,,,services.AddScoped ();      ,,,,,provider =, services.BuildServiceProvider ();   ,,,,,provider.UseCRL ();   ,,,}      ,,,static  void  Main (string [], args)   ,,,{      ,,,label1:   ,,,,,var  instance =, provider.GetService ();   ,,,,,var  data =, new  Code.Sharding.MemberSharding ();      ,,,,,data.Code =,“01”;   ,,,,,instance.SetLocation(数据);   ,,,,,var  find1 =, instance.QueryItem (b =祝辞,b.Id 祝辞,0)? . name;   ,,,,,Console.WriteLine(美元“定位数据输入{data.Code},查询值为{find1}“);      ,,,,,data.Code =,“02“;   ,,,,,instance.SetLocation(数据);   ,,,,,var  find2 =, instance.QueryItem (b =祝辞,b.Id 祝辞,0)? . name;   ,,,,,Console.WriteLine(美元“定位数据输入{data.Code},查询值为{find2}“);   ,,,,,Console.ReadLine ();   ,,,,,goto  label1;   ,,,}   以前,,}

上面代码中,通过SetLocation方法传入定位数据代码,通过QueryItem方法查询出数据并打印出来

通过services.AddCRL()注入定位配置,DBLocationCreator继承了接口IDBLocationCreator

这里完全符合核心注入规范,可以通过配置或数据库存储动态读取定位设置

public  class  DBLocationCreator : IDBLocationCreator   {才能   ,,,ISettingConfigBuilder  _settingConfigBuilder;   ,,,public  DBLocationCreator (ISettingConfigBuilder  settingConfigBuilder)   ,,,{   ,,,,,_settingConfigBuilder =, settingConfigBuilder;   ,,,}      ,,,public  void  Init ()   ,,,{   ,,,,,//自定义定位   ,,,,,_settingConfigBuilder.RegisterLocation ((t), a),=比;   ,,,,,{   ,,,,,,,var  tableName =, t.TableName;   ,,,,,,,var  dbName =,==, a.Code “02“, ?,“testdb2",:,“, testdb";   ,,,,,,,var  dataBase =,美元“Data 源=;Initial 目录={dbName}; User  ID=sa;密码=123“;;   ,,,,,,,//返回定位库和表名   ,,,,,,,return  new  CRL.Sharding.Location(数据库,表名);   ,,,,,});   ,,,,,_settingConfigBuilder.RegisterDBAccessBuild (dbLocation =比;   ,,,,,{   ,,,,,,,var  connectionString =,“Data 源=;Initial 目录=testdb; User  ID=sa;密码=123“;;   ,,,,,,,if  (dbLocation.ShardingLocation  !=, null)   ,,,,,,,{   ,,,,,,,,,connectionString =, dbLocation.ShardingLocation.DataBaseSource;   ,,,,,,,}   ,,,,,,,return  new  CRL.DBAccessBuild (connectionString DBType.MSSQL也);   ,,,,,});   ,,,}   null

如何解决在。net核心中完美解决多租户分库分表