Net Core resuelve perfectamente el problema de la división de tablas y subbibliotecas multiinquilino
Hace unos días, alguien quería hacer una plataforma multiinquilino. Cada inquilino tiene una biblioteca que se puede expandir horizontalmente. El terminal de la aplicación cambia a una biblioteca de inquilinos diferente de acuerdo con la información de inicio de sesión.
Está planeado para implementarse con ef core, dicen que no pueden hacerlo, necesitan crear dinámicamente dbContext, lo cual no es fácil de lograr
Sin embargo, esto se puede resolver fácilmente usando CRL
La siguiente es una base de datos de demostración, hay dos bibliotecas testdb y testdb2, los resultados de la consulta son los siguientes
Objetivo:
De acuerdo con la información de inicio de sesión entrante, las diferentes bibliotecas están conectadas y la consulta devuelve el resultado.
De hecho, este requisito es la realización de subbase de datos y subtabla. Al establecer la relación de mapeo de la base de datos / tabla, la coincidencia basada en los datos de posicionamiento entrantes, la búsqueda de la configuración correcta de la tabla de la base de datos y la generación de objetos de acceso a datos
Tome el programa de consola central como ejemplo
Programa de clase { proveedor IServiceProvider estático; Programa estático () { servicios var = new ServiceCollection (); services.AddCRL <DBLocationCreator> (); services.AddScoped <Code.Sharding.MemberManage> (); proveedor = services.BuildServiceProvider (); proveedor.UseCRL (); } vacío estático Main (string [] args) { etiqueta1: var instancia = proveedor. GetService <Code.Sharding.MemberManage> (); datos var = nuevo Code.Sharding.MemberSharding (); data.Code = "01"; instancia.SetLocation (datos); var find1 = instancia.QueryItem (b => b.Id> 0)? Nombre; Console.WriteLine ($ "entrada de datos de ubicación {data.Code}, el valor de la consulta es {find1}"); data.Code = "02"; instancia.SetLocation (datos); var find2 = instancia.QueryItem (b => b.Id> 0)? Nombre; Console.WriteLine ($ "entrada de datos de ubicación {data.Code}, el valor de la consulta es {find2}"); Console.ReadLine (); goto label1; } }
En el código anterior, el código de datos de ubicación se pasa a través del método SetLocation, y los datos se consultan e imprimen a través del método QueryItem
Inyecte la configuración de ubicación a través de los servicios. AddCRL <DBLocationCreator> (), DBLocationCreator hereda la interfaz IDBLocationCreator
Esto cumple con la especificación de inyección de núcleo, y la configuración de posicionamiento se puede leer dinámicamente a través de la configuración o el almacenamiento de la base de datos
clase pública DBLocationCreator: IDBLocationCreator { ISettingConfigBuilder _settingConfigBuilder; public DBLocationCreator (ISettingConfigBuilder settingConfigBuilder) { _settingConfigBuilder = settingConfigBuilder; } vacío público Init () { // Posicionamiento personalizado _settingConfigBuilder.RegisterLocation <Code.Sharding.MemberSharding> ((t, a) => { var TableName = t.TableName; var dbName = a.Code == "02"? "testdb2": "testdb"; var dataBase = $ "Fuente de datos = .; Catálogo inicial = {dbName}; ID de usuario = sa; Contraseña = 123"; // Regresar a la biblioteca de ubicación y el nombre de la tabla devolver nuevo CRL.Sharding.Location (dataBase, tableName); }); _settingConfigBuilder.RegisterDBAccessBuild (dbLocation => { var connectionString = "Fuente de datos = .; Catálogo inicial = testdb; ID de usuario = sa; Contraseña = 123"; if (dbLocation.ShardingLocation! = nulo) { connectionString = dbLocation.ShardingLocation.DataBaseSource; } devolver nuevo CRL.DBAccessBuild (DBType.MSSQL, connectionString); }); } }
En el método Init, se implementan dos operaciones: RegisterLocation define cómo devolver diferentes bibliotecas / tablas en función del código de datos de posicionamiento.
Acceso a datos a través de RegisterDBAccessBuild
Definición de objeto
Clase pública MemberSharding: CRL.IModel { [CRL.Attribute.Field (KeepIdentity = true)] // Siga insertando la clave primaria Id público int { obtener; conjunto; } Nombre de cadena pública { obtener; conjunto; } Código de cadena pública; } clase pública MemberManage: CRL.Sharding.BaseProvider <MemberSharding> { }
Ejecute el programa de prueba y la salida del resultado es
El código anterior usa parámetros de posicionamiento personalizados y reglas de posicionamiento, sin ningún acoplamiento, y la llamada también es muy simple, logrando perfectamente el efecto esperado
Dirección del código de prueba: https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest
Hace unos días, alguien quería hacer una plataforma multiinquilino. Cada inquilino tiene una biblioteca que se puede expandir horizontalmente. El terminal de la aplicación cambia a una biblioteca de inquilinos diferente de acuerdo con la información de inicio de sesión.
Está planeado para implementarse con ef core, dicen que no pueden hacerlo, necesitan crear dinámicamente dbContext, lo cual no es fácil de lograr
Sin embargo, esto se puede resolver fácilmente usando CRL
La siguiente es una base de datos de demostración, hay dos bibliotecas testdb y testdb2, los resultados de la consulta son los siguientes
Objetivo:
De acuerdo con la información de inicio de sesión entrante, las diferentes bibliotecas están conectadas y la consulta devuelve el resultado.
De hecho, este requisito es la realización de subbase de datos y subtabla. Al establecer la relación de mapeo de la base de datos / tabla, la coincidencia basada en los datos de posicionamiento entrantes, la búsqueda de la configuración correcta de la tabla de la base de datos y la generación de objetos de acceso a datos
Tome el programa de consola central como ejemplo
Programa de clase { proveedor IServiceProvider estático; Programa estático () { servicios var = new ServiceCollection (); services.AddCRL <DBLocationCreator> (); services.AddScoped <Code.Sharding.MemberManage> (); proveedor = services.BuildServiceProvider (); proveedor.UseCRL (); } vacío estático Main (string [] args) { etiqueta1: var instancia = proveedor. GetService <Code.Sharding.MemberManage> (); datos var = nuevo Code.Sharding.MemberSharding (); data.Code = "01"; instancia.SetLocation (datos); var find1 = instancia.QueryItem (b => b.Id> 0)? Nombre; Console.WriteLine ($ "entrada de datos de ubicación {data.Code}, el valor de la consulta es {find1}"); data.Code = "02"; instancia.SetLocation (datos); var find2 = instancia.QueryItem (b => b.Id> 0)? Nombre; Console.WriteLine ($ "entrada de datos de ubicación {data.Code}, el valor de la consulta es {find2}"); Console.ReadLine (); goto label1; } }
En el código anterior, el código de datos de ubicación se pasa a través del método SetLocation, y los datos se consultan e imprimen a través del método QueryItem
Inyecte la configuración de ubicación a través de los servicios. AddCRL <DBLocationCreator> (), DBLocationCreator hereda la interfaz IDBLocationCreator
Esto cumple con la especificación de inyección de núcleo, y la configuración de posicionamiento se puede leer dinámicamente a través de la configuración o el almacenamiento de la base de datos
clase pública DBLocationCreator: IDBLocationCreator { ISettingConfigBuilder _settingConfigBuilder; public DBLocationCreator (ISettingConfigBuilder settingConfigBuilder) { _settingConfigBuilder = settingConfigBuilder; } vacío público Init () { // Posicionamiento personalizado _settingConfigBuilder.RegisterLocation <Code.Sharding.MemberSharding> ((t, a) => { var TableName = t.TableName; var dbName = a.Code == "02"? "testdb2": "testdb"; var dataBase = $ "Fuente de datos = .; Catálogo inicial = {dbName}; ID de usuario = sa; Contraseña = 123"; // Regresar a la biblioteca de ubicación y el nombre de la tabla devolver nuevo CRL.Sharding.Location (dataBase, tableName); }); _settingConfigBuilder.RegisterDBAccessBuild (dbLocation => { var connectionString = "Fuente de datos = .; Catálogo inicial = testdb; ID de usuario = sa; Contraseña = 123"; if (dbLocation.ShardingLocation! = nulo) { connectionString = dbLocation.ShardingLocation.DataBaseSource; } devolver nuevo CRL.DBAccessBuild (DBType.MSSQL, connectionString); }); } }
En el método Init, se implementan dos operaciones: RegisterLocation define cómo devolver diferentes bibliotecas / tablas en función del código de datos de posicionamiento.
Acceso a datos a través de RegisterDBAccessBuild
Definición de objeto
Clase pública MemberSharding: CRL.IModel { [CRL.Attribute.Field (KeepIdentity = true)] // Siga insertando la clave primaria Id público int { obtener; conjunto; } Nombre de cadena pública { obtener; conjunto; } Código de cadena pública; } clase pública MemberManage: CRL.Sharding.BaseProvider <MemberSharding> { }
Ejecute el programa de prueba y la salida del resultado es
El código anterior usa parámetros de posicionamiento personalizados y reglas de posicionamiento, sin ningún acoplamiento, y la llamada también es muy simple, logrando perfectamente el efecto esperado
Dirección del código de prueba: https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest