ネットコアはマルチテナントのサブライブラリとテーブル分割の問題を完全に解決します
数日前、マルチテナントプラットフォームを作成したいと思った人がいて、各テナントには、水平方向に拡張できるライブラリがあります。
efコアでの実装が計画されており、実行できないと言い、dbContextを動的に作成する必要がありますが、これは簡単ではありません
ただし、これはCRLを使用して簡単に解決できます
以下はデモデータベースです。testdbとtestdb2の2つのライブラリがあり、クエリ結果は次のとおりです。
目標:
受信したログイン情報に従って、さまざまなライブラリが接続され、クエリは結果を返します。たとえば、ログイン担当者が01の場合はd1.defaultを返し、ログイン担当者が02の場合はd2.defaultを返します。
実際、この要件は、サブデータベースとサブテーブルの実現です。データベースとテーブルのマッピング関係を設定し、受信したポジショニングデータに基づいて照合し、正しいデータベーステーブル構成を見つけ、データアクセスオブジェクトを生成します
コアコンソールプログラムを例に取る
クラスProgram { 静的IServiceProviderプロバイダー; static Program() { var services = new ServiceCollection(); services.AddCRL <DBLocationCreator>(); services.AddScoped <Code.Sharding.MemberManage>(); プロバイダー= 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($ "location data input {data.Code}、query value is {find1}") ; data.Code = "02"; instance.SetLocation(data); var find2 = instance.QueryItem(b => b.Id> 0)?。Name; Console.WriteLine($ "location data input {data.Code} 、クエリ値は{find2} "); Console.ReadLine(); goto label1; } }
上記のコードでは、位置データコードはSetLocationメソッドを介して渡され、データはQueryItemメソッドを介してクエリおよび出力されます。
services.AddCRL <DBLocationCreator>()を介して場所の構成を挿入します。DBLocationCreatorはインターフェイスIDBLocationCreatorを継承します
これはコアインジェクション仕様に完全に準拠しており、配置設定は構成またはデータベースストレージを通じて動的に読み取ることができます。
パブリッククラス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"; // 新しい戻り値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メソッドでは、2つの操作が実装されています。RegisterLocationは、位置決めデータコードに基づいて、異なるライブラリ/テーブルを返す方法を定義します。
RegisterDBAccessBuildによるデータアクセス
オブジェクト定義
パブリッククラスMemberSharding:CRL.IModel { [CRL.Attribute.Field(KeepIdentity = true)] //保持挿入入主键 public int Id { get; セットする; } public string Name { get; セットする; } 公開文字列コード。 } パブリッククラスMemberManage:CRL.Sharding.BaseProvider <MemberSharding> { }
テストプログラムを実行すると、結果の出力は
上記のコードは、カスタムポジショニングパラメーターとポジショニングルールを使用しており、カップリングはありません。また、呼び出しも非常にシンプルで、期待される効果を完全に実現します
テストコードアドレス:https : //github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest
数日前、マルチテナントプラットフォームを作成したいと思った人がいて、各テナントには、水平方向に拡張できるライブラリがあります。
efコアでの実装が計画されており、実行できないと言い、dbContextを動的に作成する必要がありますが、これは簡単ではありません
ただし、これはCRLを使用して簡単に解決できます
以下はデモデータベースです。testdbとtestdb2の2つのライブラリがあり、クエリ結果は次のとおりです。
目標:
受信したログイン情報に従って、さまざまなライブラリが接続され、クエリは結果を返します。たとえば、ログイン担当者が01の場合はd1.defaultを返し、ログイン担当者が02の場合はd2.defaultを返します。
実際、この要件は、サブデータベースとサブテーブルの実現です。データベースとテーブルのマッピング関係を設定し、受信したポジショニングデータに基づいて照合し、正しいデータベーステーブル構成を見つけ、データアクセスオブジェクトを生成します
コアコンソールプログラムを例に取る
クラスProgram { 静的IServiceProviderプロバイダー; static Program() { var services = new ServiceCollection(); services.AddCRL <DBLocationCreator>(); services.AddScoped <Code.Sharding.MemberManage>(); プロバイダー= 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($ "location data input {data.Code}、query value is {find1}") ; data.Code = "02"; instance.SetLocation(data); var find2 = instance.QueryItem(b => b.Id> 0)?。Name; Console.WriteLine($ "location data input {data.Code} 、クエリ値は{find2} "); Console.ReadLine(); goto label1; } }
上記のコードでは、位置データコードはSetLocationメソッドを介して渡され、データはQueryItemメソッドを介してクエリおよび出力されます。
services.AddCRL <DBLocationCreator>()を介して場所の構成を挿入します。DBLocationCreatorはインターフェイスIDBLocationCreatorを継承します
これはコアインジェクション仕様に完全に準拠しており、配置設定は構成またはデータベースストレージを通じて動的に読み取ることができます。
パブリッククラス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"; // 新しい戻り値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メソッドでは、2つの操作が実装されています。RegisterLocationは、位置決めデータコードに基づいて、異なるライブラリ/テーブルを返す方法を定義します。
RegisterDBAccessBuildによるデータアクセス
オブジェクト定義
パブリッククラスMemberSharding:CRL.IModel { [CRL.Attribute.Field(KeepIdentity = true)] //保持挿入入主键 public int Id { get; セットする; } public string Name { get; セットする; } 公開文字列コード。 } パブリッククラスMemberManage:CRL.Sharding.BaseProvider <MemberSharding> { }
テストプログラムを実行すると、結果の出力は
上記のコードは、カスタムポジショニングパラメーターとポジショニングルールを使用しており、カップリングはありません。また、呼び出しも非常にシンプルで、期待される効果を完全に実現します
テストコードアドレス:https : //github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest