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
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; } }
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
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); }); } }
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
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> { }
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
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; } }
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
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); }); } }
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
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> { }
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