diff --git a/.gitignore b/.gitignore index df4c3d4..59de9a8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ ################################################################################ /.vs/FreeSql.wiki/v17 +/.vs/FreeSql.wiki/project-colors.json diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json index 5e2c41d..b355f63 100644 --- a/.vs/VSWorkspaceState.json +++ b/.vs/VSWorkspaceState.json @@ -2,6 +2,6 @@ "ExpandedNodes": [ "" ], - "SelectedNode": "\\查询父子关系.md", + "SelectedNode": "\\修改.md", "PreviewInSolutionExplorer": false } \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 30b523a..9c92248 100644 Binary files a/.vs/slnx.sqlite and b/.vs/slnx.sqlite differ diff --git a/分表分库.md b/分表分库.md index cf4c8ae..0c39784 100644 --- a/分表分库.md +++ b/分表分库.md @@ -53,7 +53,7 @@ using (TransactionScope ts = new TransactionScope()) 分布式数据库 TCC/SAGA 方案请移步:https://github.com/2881099/FreeSql.Cloud -## 分库1 利用 IdleBus 重写 IFreeSql +## 【分库】利用 IdleBus 重写 IFreeSql 在 asp.net core 利用 IdleBus 重写 IFreeSql 支持多库操作 @@ -176,85 +176,8 @@ namespace net50_webapi_idlebus } ``` ---- - -## 分库2 IdleBus - -IFreeSql 对应一个数据库,分库是不是要定义N个 IFreeSql?分库的租户场景,那不要定义10000个? - -IdleBus 空闲对象管理容器,有效组织对象重复利用,自动创建、销毁,解决【实例】过多且长时间占用的问题。有时候想做一个单例对象重复使用提升性能,但是定义多了,有的又可能一直空闲着占用资源。专门解决:又想重复利用,又想少占资源的场景。https://github.com/2881099/IdleBus - -> dotnet add package IdleBus - -```csharp -static IdleBus ib = new IdleBus(TimeSpan.FromMinutes(10)); - -ib.Register("db1", () => new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1").Build()); -ib.Register("db2", () => new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str2").Build()); -ib.Register("db3", () => new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, "str3").Build()); -//...注册很多个 - -ib.Get("db1").Select().Limit(10).ToList(); -``` -IdleBus 也是【单例】设计!主要的两个方法,注册,获取。使用 IdleBus 需要弱化 IFreeSql 的存在,每次使用 ib.Get 获取。 - -```csharp -public static class IdleBusExtesions -{ - static AsyncLocal asyncLocalTenantId = new AsyncLocal(); - public static IdleBus ChangeTenant(this IdleBus ib, string tenantId) - { - asyncLocalTenantId.Value = tenantId; - return ib; - } - public static IFreeSql Get(this IdleBus ib) => ib.Get(asyncLocalTenantId.Value ?? "db1"); - public static IBaseRepository GetRepository(this IdleBus ib) where T : class => ib.Get().GetRepository(); - - //------------------------------------------------------- - - static void test() - { - IdleBus ib = null; //单例注入 - - var fsql = ib.Get(); //获取当前租户对应的 IFreeSql - - var fsql00102 = ib.ChangeTenant("00102").Get(); //切换租户,后面的操作都是针对 00102 - - var songRepository = ib.GetRepository(); - var detailRepository = ib.GetRepository(); - } - - //------------------------------------------------------- - - public static IServiceCollection AddIdleBusRepository(this IServiceCollection services, IdleBus ib, params Assembly[] assemblies) - { - services.AddSingleton(ib); - services.AddScoped(typeof(IBaseRepository<>), typeof(YourDefaultRepository<>)); - services.AddScoped(typeof(BaseRepository<>), typeof(YourDefaultRepository<>)); - services.AddScoped(typeof(IBaseRepository<,>), typeof(YourDefaultRepository<,>)); - services.AddScoped(typeof(BaseRepository<,>), typeof(YourDefaultRepository<,>)); - - if (assemblies?.Any() == true) - foreach (var asse in assemblies) //批量注册 - foreach (var repo in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(IBaseRepository).IsAssignableFrom(a))) - services.AddScoped(repo); - return services; - } -} - -class YourDefaultRepository : BaseRepository where T : class -{ - public YourDefaultRepository(IdleBus ib) : base(ib.Get(), null, null) { } -} -class YourDefaultRepository : BaseRepository where T : class -{ - public YourDefaultRepository(IdleBus ib) : base(ib.Get(), null, null) { } -} -``` - 分库总结: -- 跨库 可以使用 ib.Get() 获取 IFreeSql 进行 CRUD; - 跨库 事务不好处理,注意了; - 跨库 查询不好处理,注意了;