A sub-tabela de sub-biblioteca de vários inquilinos no núcleo da rede resolve perfeitamente o problema da sub-tabela de sub-bibliotecas de vários inquilinos no núcleo da rede

O núcleo da rede resolve perfeitamente o problema da sub-biblioteca multi-inquilino e da divisão de tabelas

 Alguns dias atrás, alguém queria criar uma plataforma com vários locatários, cada terminal possui uma biblioteca que pode ser expandida horizontalmente.O terminal do aplicativo muda para uma biblioteca de inquilinos diferente, de acordo com as informações de login.

Ele está planejado para ser implementado com ef core, eles dizem que não podem fazê-lo, precisam criar dinamicamente o dbContext, o que não é fácil de alcançar

No entanto, isso pode ser facilmente resolvido usando a CRL

 

A seguir, um banco de dados demo, existem duas bibliotecas testdb e testdb2, os resultados da consulta são os seguintes

Objetivo:

De acordo com as informações de login recebidas, as diferentes bibliotecas são conectadas e a consulta retorna resultados. Por exemplo, se a pessoa de logon for 01, retorne d1.default e se a pessoa de logon for 02, retorne d2.default

De fato, esse requisito é a realização de sub-banco de dados e sub-tabela. Ao definir o relacionamento de mapeamento de banco de dados / tabela, corresponder com base nos dados de posicionamento recebidos, encontrar a configuração correta da tabela de banco de dados e gerar objetos de acesso a dados

 

Tome o programa principal do console como um exemplo

Copiar código
programa de classe 
    { 
        provedor IServiceProvider estático; 
        Programa estático () 
        { 
            var services = new ServiceCollection (); 
            services.AddCRL <DBLocationCreator> (); 
            services.AddScoped <Code.Sharding.MemberManage> (); 

            provider = services.BuildServiceProvider (); 
            provider.UseCRL (); 
        } 

        Static void Main (string [] args) 
        { 

        label1: 
            instância var = provider.GetService <Code.Sharding.MemberManage> (); 
            var data = novo Code.Sharding.MemberSharding (); 

            data.Code = "01";
            instance.SetLocation (data);
            var find1 = instance.QueryItem (b => b.Id> 0)?. Name; 
            Console.WriteLine ($ "entrada de dados do local {data.Code}, valor da consulta {find1}"); 

            data.Code = "02 "; 
            instance.SetLocation (data); 
            var find2 = instance.QueryItem (b => b.Id> 0)?. Nome; 
            Console.WriteLine ($" entrada de dados de localização {data.Code}, o valor da consulta é {find2} "); 
            Console.ReadLine (); 
            vá para label1; 
        } 
    }
Copiar código

No código acima, o código de dados do local é passado pelo método SetLocation e os dados são consultados e impressos pelo método QueryItem

 

Injete a configuração do local por meio de services.AddCRL <DBLocationCreator> (), DBLocationCreator herda a interface IDBLocationCreator

Isso está em total conformidade com a especificação principal de injeção, e as configurações de posicionamento podem ser lidas dinamicamente através da configuração ou armazenamento do banco de dados

Copiar código
classe pública DBLocationCreator: IDBLocationCreator 
    { 
        ISettingConfigBuilder _settingConfigBuilder; 
        DBLocationCreator público (ISettingConfigBuilder settingConfigBuilder) 
        { 
            _settingConfigBuilder = settingConfigBuilder; 
        } 

        public void Init () 
        { 
            // 
            definindoConfigBuilder.RegisterLocation <Code.Sharding.MemberSharding> ((t, a) => 
            { 
                var tableName = t.TableName; 
                var dbName = a.Code == "02"? "testdb2": "testdb";  
                var dataBase = $ "Fonte de dados = .; Catálogo inicial = {dbName}; ID do usuário = sa; Senha = 123";
                // 
                retorna novo CRL.Sharding.Location (dataBase, tableName); 
            }); 
            _settingConfigBuilder.RegisterDBAccessBuild (dbLocation => 
            { 
                var connectionString = "Fonte de dados = .; Catálogo inicial = testdb; ID do usuário = sa; Senha = 123"; 
                if (dbLocation.ShardingLocation! = null) 
                { 
                    connectionString = dbLocation.ShardingLocation.DataBaseSource; 
                } 
                retornar novo CRL.DBAccessBuild (DBType.MSSQL, connectionString); 
            }); 
        } 
    }
Copiar código

No método Init, duas operações são implementadas: RegisterLocation define como retornar diferentes bibliotecas / tabelas com base no código de dados de posicionamento.

Acesso a dados através do RegisterDBAccessBuild

 Definição de objeto

Copiar código
    public class MemberSharding: CRL.IModel 
    { 
        [CRL.Attribute.Field (KeepIdentity = true)] // // 
        public int Id 
        { 
            get; 
            conjunto; 
        } 
        public string Nome 
        { 
            get; 
            conjunto; 
        } 
        public string Code; 
    } 
    public class MemberManage: CRL.Sharding.BaseProvider <MemberSharding> 
    { 

    }
Copiar código

 

Execute o programa de teste e a saída do resultado é

 

O código acima usa parâmetros de posicionamento personalizados e regras de posicionamento, sem nenhum acoplamento, e a chamada também é muito simples, alcançando perfeitamente o efeito esperado

Endereço do código de teste: https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest

 Alguns dias atrás, alguém queria criar uma plataforma com vários locatários, cada terminal possui uma biblioteca que pode ser expandida horizontalmente.O terminal do aplicativo muda para uma biblioteca de inquilinos diferente, de acordo com as informações de login.

Ele está planejado para ser implementado com ef core, eles dizem que não podem fazê-lo, precisam criar dinamicamente o dbContext, o que não é fácil de alcançar

No entanto, isso pode ser facilmente resolvido usando a CRL

 

A seguir, um banco de dados demo, existem duas bibliotecas testdb e testdb2, os resultados da consulta são os seguintes

Objetivo:

De acordo com as informações de login recebidas, as diferentes bibliotecas são conectadas e a consulta retorna resultados. Por exemplo, se a pessoa de logon for 01, retorne d1.default e se a pessoa de logon for 02, retorne d2.default

De fato, esse requisito é a realização de sub-banco de dados e sub-tabela. Ao definir o relacionamento de mapeamento de banco de dados / tabela, corresponder com base nos dados de posicionamento recebidos, encontrar a configuração correta da tabela de banco de dados e gerar objetos de acesso a dados

 

Tome o programa principal do console como um exemplo

Copiar código
programa de classe 
    { 
        provedor IServiceProvider estático; 
        Programa estático () 
        { 
            var services = new ServiceCollection (); 
            services.AddCRL <DBLocationCreator> (); 
            services.AddScoped <Code.Sharding.MemberManage> (); 

            provider = services.BuildServiceProvider (); 
            provider.UseCRL (); 
        } 

        Static void Main (string [] args) 
        { 

        label1: 
            instância var = provider.GetService <Code.Sharding.MemberManage> (); 
            var data = novo Code.Sharding.MemberSharding (); 

            data.Code = "01";
            instance.SetLocation (data); 
            var find1 = instance.QueryItem (b => b.Id> 0)?. Name; 
            Console.WriteLine ($ "entrada de dados do local {data.Code}, o valor da consulta é {find1}") ; 

            data.Code = "02"; 
            instance.SetLocation (data); 
            var find2 = instance.QueryItem (b => b.Id> 0)?. Nome; 
            Console.WriteLine ($ "entrada de dados de localização {data.Code} , O valor da consulta é {find2} "); 
            Console.ReadLine (); 
            goto label1; 
        } 
    }
Copiar código

No código acima, o código de dados do local é passado pelo método SetLocation e os dados são consultados e impressos pelo método QueryItem

 

Injete a configuração do local por meio de services.AddCRL <DBLocationCreator> (), DBLocationCreator herda a interface IDBLocationCreator

Isso está em total conformidade com a especificação principal de injeção, e as configurações de posicionamento podem ser lidas dinamicamente através da configuração ou armazenamento do banco de dados

Copiar código
classe pública DBLocationCreator: IDBLocationCreator 
    { 
        ISettingConfigBuilder _settingConfigBuilder; 
        DBLocationCreator público (ISettingConfigBuilder settingConfigBuilder) 
        { 
            _settingConfigBuilder = settingConfigBuilder; 
        } 

        public void Init () 
        { 
            // 
            definindoConfigBuilder.RegisterLocation <Code.Sharding.MemberSharding> ((t, a) => 
            { 
                var tableName = t.TableName; 
                var dbName = a.Code == "02"? "testdb2": "testdb";  
                var dataBase = $ "Fonte de dados = .; Catálogo inicial = {dbName}; ID do usuário = sa; Senha = 123";
                // 
                retorna novo CRL.Sharding.Location (dataBase, tableName);
            }); 
            _settingConfigBuilder.RegisterDBAccessBuild (dbLocation => 
            { 
                var connectionString = "Fonte de dados = .; Catálogo inicial = testdb; ID do usuário = sa; Senha = 123"; 
                if (dbLocation.ShardingLocation! = null) 
                { 
                    connectionString = dbLocation.ShardingLocation.DataBaseSource; 
                } 
                retornar novo CRL.DBAccessBuild (DBType.MSSQL, connectionString); 
            }); 
        } 
    }
Copiar código

No método Init, duas operações são implementadas: RegisterLocation define como retornar diferentes bibliotecas / tabelas com base no código de dados de posicionamento.

Acesso a dados através do RegisterDBAccessBuild

 Definição de objeto

Copiar código
    public class MemberSharding: CRL.IModel 
    { 
        [CRL.Attribute.Field (KeepIdentity = true)] // // 
        public int Id 
        { 
            get; 
            conjunto; 
        } 
        public string Nome 
        { 
            get; 
            conjunto; 
        } 
        public string Code; 
    } 
    public class MemberManage: CRL.Sharding.BaseProvider <MemberSharding> 
    { 

    }
Copiar código

 

Execute o programa de teste e a saída do resultado é

 

O código acima usa parâmetros de posicionamento personalizados e regras de posicionamento, sem nenhum acoplamento, e a chamada também é muito simples, alcançando perfeitamente o efeito esperado

Endereço do código de teste: https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest

Acho que você gosta

Origin www.cnblogs.com/Leo_wl/p/12733089.html
Recomendado
Clasificación