La subtabla de subbibliotecas multiinquilino en net core resuelve perfectamente el problema de la subtabla de subbibliotecas multiinquilino en net core

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

Código de copia
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;
        }
    }
Código de copia

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

Código de copia
 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);
            });
        }
    }
Código de copia

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

Código de copia
    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>
    {

    }
Código de copia

 

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

Código de copia
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;
        }
    }
Código de copia

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

Código de copia
 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);
            });
        }
    }
Código de copia

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

Código de copia
    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>
    {

    }
Código de copia

 

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

Supongo que te gusta

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