介绍
本篇内容主要讲解”如何解决在。net核心中完美解决多租户分库分表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习”如何解决在。net核心中完美解决多租户分库分表”吧!
前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库
计划用ef核心实现,他们说做不出来,需要动态创建dbContext,不好实现
然而这个使用CRL很轻松就能解决了
以下为演示数据库,有两个库和testdb testdb2,查询结果如下
<强>目标:强>
根据传入登录信息连不不同的库,查询返回结果,如登录人为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核心中完美解决多租户分库分表