ネットコアのマルチテナントサブライブラリサブテーブルは、ネットコアのマルチテナントサブライブラリサブテーブルの問題を完全に解決します

ネットコアはマルチテナントのサブライブラリとテーブル分割の問題を完全に解決します

 数日前、マルチテナントプラットフォームを作成したいと思った人がいて、各テナントには、水平方向に拡張できるライブラリがあります。

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

おすすめ

転載: www.cnblogs.com/Leo_wl/p/12733089.html