华域联盟 .Net 详解在.net core中完美解决多租户分库分表的问题

详解在.net core中完美解决多租户分库分表的问题

详解在.net core中完美解决多租户分库分表的问题
 更新时间:2020年04月14日 14:29:02   作者:hubro  

这篇文章主要介绍了详解在.net core中完美解决多租户分库分表的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库
计划用ef core实现,他们说做不出来,需要动态创建dbContext,不好实现
然而这个使用CRL很轻松就能解决了
以下为演示数据库,有两个库testdb和testdb2,查询结果如下

目标:
根据传入登录信息连不不同的库,查询返回结果,如登录人为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实现数据访问
运行测试程序,结果输出为

上面代码通过自定义定位参数和定位规则,没有任何耦合,调用也很简单,完美达到了预期效果
测试代码地址:github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest
到此这篇关于详解在.net core中完美解决多租户分库分表的问题的文章就介绍到这了,更多相关.net core多租户分库分表内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:详解基于Mybatis-plus多租户实现方案springboot多租户设计过程图解利用EF6简单实现多租户的应用MybatisPlus 多租户架构(Multi-tenancy)实现详解MyBatis利用MyCat实现多租户的简单思路分享

.net
core
多租户
分库分表

相关文章
ASP.Net 分页控件源码由于.net自带的分页功能极其死板,自定义性不强不能满足需求
俺花了一个多星期的时间 写成的一个.net分页控件 2007-03-03
MVC框架是什么 这里为你解答MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。这篇文章为大家详细介绍了MVC框架是什么,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-12-12
使用DataGrid中扩展ItemRenderer和HeaderRenderer进行操作这两天在用Flex DataGrid做点东西,走了不少弯路,现将心得分享一下。

2009-02-02
Asp.Net如何将多个RadioButton指定在一个组中将多个RadioButton指定在一个组中,实现其实很简单,一句代码即可,具体如下,希望对大家有所帮助 2013-12-12
datatable行转列示例分享这篇文章主要介绍了datatable行转列示例,指定需要转换的表和转换表表头对应旧表字段就可以转换了 2014-01-01
管理员登录设计(第7节)这篇文章主要内容是管理员登录设计,通过设计了解命名空间的概念,掌握命名控件的的构建和使用以及数据的读操作,需要的朋友可以参考下
2015-08-08
基于Asp.Net MVC4 Bundle捆绑压缩技术的介绍本篇文章,小编将为大家介绍,Asp.Net MVC4 Bundle捆绑压缩技术,有需要的朋友可以参考一下
2013-04-04
php使用socket编程示例这篇文章主要介绍了php使用socket编程的示例,大家参考使用吧 2014-01-01
asp.net Checbox在GridView中的应用实例分析这篇文章主要介绍了asp.net Checbox在GridView中的应用,结合实例形式分析了GridView中添加与使用Checbox的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 2016-07-07
ASP.NET批量下载文件的方法这篇文章主要介绍了ASP.NET批量下载文件的方法,实例汇总了常见的asp.net实现批量下载的方法,具有一定的实用价值,需要的朋友可以参考下 2014-11-11

最新评论

本文由 华域联盟 原创撰写:华域联盟 » 详解在.net core中完美解决多租户分库分表的问题

转载请保留出处和原文链接:https://www.cnhackhy.com/5146.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部