CSFramework.EF应用 - ASP.NETCore/WebApi使用IDatabase动态代理创建多个数据库实例


CSFramework.EF - IDatabase动态代理-开发框架文库

通过DI依赖注入IDatabase扩展接口,在.NET项目中使用多个数据库实例

内容简介

通过DI依赖注入IDatabase扩展接口,在.NET Core项目中同时使用多个数据库实例,给开发者一种极其简单的方式访问和操作数据库,代码精简,高效开发。

从容器中获取实例:

C# 全选
var db1 = _service.GetService<ILicenseDatabase>();
var db2 = _service.GetService<ISystemDatabase>();

var user = db1.GetQueryable<sys_AdminUser>().FirstOrDefault();
var menu = db2.GetQueryable<tb_MyMenu>().FirstOrDefault();

创建数据库扩展接口(继承IDatabase接口)

C# 全选
    /// <summary>
    /// 授权系统数据库接口
    /// </summary>
    public interface ILicenseDatabase : CSFramework.EF.IDatabase
    {
        //
    }

    /// <summary>
    /// CSFramework开发框架系统数据库接口
    /// </summary>
    public interface ISystemDatabase : CSFramework.EF.IDatabase
    {
        //
    }

 

注入IDatabase扩展接口

 

C# 全选
//注入授权系统数据库
builder.Services.AddDatabase((config) =>
{
    var key = "Database:CSFramework_LicenseV3";
    var dbOption = builder.Configuration.GetSection(key).Get<DatabaseOptions>(); //appsettings.json
    config.UseDatabase<ILicenseDatabase>(dbOption, optionsBuilder: (op) =>
    {
        //这个可以设置参数
    });
});

//注入开发框架系统数据库
builder.Services.AddDatabase((config) =>
{
    var key = "Database:CSFrameworkV6_System";
    var dbOption = builder.Configuration.GetSection(key).Get<DatabaseOptions>(); //appsettings.json
    config.UseDatabase<ISystemDatabase>(dbOption, optionsBuilder: (op) =>
    {
        //这个可以设置参数
    });
});

 

AddDatabase 扩展方法

 

C# 全选
        /// <summary>
        /// 注入CSFramework.EF DatabaseBuilder构件
        /// </summary>
        /// <param name="services">服务集合</param>
        /// <param name="builder">配置项</param>
        /// <returns></returns>
        public static IServiceCollection AddDatabase(this IServiceCollection services, Action<IDatabaseBuilder> builder = null)
        {
            services.AddOptions<DatabaseOptions>();
            services.AddLogging();

            DatabaseBuilder container = new DatabaseBuilder(services);
            builder?.Invoke(container);

            services.AddSingleton(container);
            services.AddSingleton<IDatabaseBuilder>(container);

            return services;
        }

 

UseDatabase 扩展方法

使用动态代理技术,需要添加2个Nuget包:

C# 全选
<PackageReference Include="Castle.Core" Version="5.1.1" />
<PackageReference Include="Dynamitey" Version="2.0.10.189" />

 

动态代理创建数据库实例,核心代码:

 

C# 全选
 /// <summary>
 /// 用于构建和配置CSFramework.EF.IDatabase数据库实例
 /// </summary>
 internal class DatabaseBuilder : IDatabaseBuilder
 {
     private readonly IServiceCollection _services;

     public DatabaseBuilder(IServiceCollection services)
     {
         _services = services;
     }

     /// <summary>
     /// 使用数据库
     /// </summary>
     /// <typeparam name="TDatabase">IDatabase派生接口</typeparam>
     /// <param name="dbOption">数据库配置</param>
     /// <param name="optionsBuilder">自定义配置</param>
     /// <returns></returns>
     public IDatabaseBuilder UseDatabase<TDatabase>(DatabaseOptions dbOption, Action<DatabaseOptions> optionsBuilder)
          where TDatabase : class, IDatabase
     {
         var optionName = typeof(TDatabase).FullName;//接口全名:CSFramework.LicenseServerV3.ILicenseDatabase
         _services.AddOptions<DatabaseOptions>(optionName);

         if (optionsBuilder != null)
         {
             _services.Configure(optionName, optionsBuilder);
         }

         _services.AddScoped(serviceProvider =>
         {
             var parameter = new DatabaseConfig
             {
                 ConnectionString = dbOption.ConnectionString,
                 DatabaseType = dbOption.DatabaseType,
                 Schema = dbOption.Schema,
                 EntityTypes = DatabaseEngine.GetEntityTypes(),
                 AllTypes = DatabaseEngine.GetTypes(),
                 CommandTimeout = 30,
                 TableSuffix = "",
             };

             IDatabase db = DatabaseFactory.GetDatabase(parameter);

             if (typeof(TDatabase) == typeof(IDatabase))
                 return (TDatabase)db;
             else
                 return db.CreateProxy<TDatabase>(); //动态代理创建数据库实例
         });

         return this;
     }
 }

数据库配置文件

appsettings.json 配置文件

C# 全选
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Database": {

    //授权系统数据库连接配置
    "CSFramework_LicenseV3": {
      "DatabaseType": "SqlServer",
      "ServiceOrSID": "Database", //参考值:Database/Service/SID
      "Schema": "", //注意:如果连接Database,不需要指定Schema
      "ConnectionString": "Server=localhost;Database=CSFramework_LicenseV3;User ID=sa;Password=123; Max Pool Size=512; Pooling=true;Connect Timeout=30;TrustServerCertificate=true;"
    },

    //开发框架系统数据库连接配置
    "CSFrameworkV6_System": {
      "DatabaseType": "SqlServer",
      "ServiceOrSID": "Database", //参考值:Database/Service/SID
      "Schema": "", //注意:如果连接Database,不需要指定Schema
      "ConnectionString": "Server=localhost;Database=CSFrameworkV6_System;User ID=sa;Password=123; Max Pool Size=512; Pooling=true;Connect Timeout=30;TrustServerCertificate=true;"
    },

  }
}

 

DatabaseOptions 类

 

C# 全选
    /// <summary>
    /// 数据库连接参数配置(加载appsettings.json)
    /// </summary>
    internal class DatabaseOptions
    {  /// <summary>
       /// 连接字符串
       /// </summary>
        public string ConnectionString { get; set; }

        /// <summary>
        /// 数据库类型
        /// </summary>
        public DatabaseType DatabaseType { get; set; }

        /// <summary>
        /// 数据库连接类型。参考值:Database/Service/SID
        /// </summary>
        public string ServiceOrSID { get; set; }

        /// <summary>
        /// 架构,服务名(oracle)
        /// </summary>
        public string Schema { get; set; }

    }

 

功能测试 - 通过动态代理创建多个数据库实例

WebApi控制器

C# 全选
[ApiController]
[Route("api/[controller]/[action]")]
[OpenApiTag("API控制器")]
public class LicenseController : ControllerBase
{
    private ILicenseClient _business;
    private IServiceProvider _service;

    public LicenseController(ILicenseClient business,IServiceProvider service)
    {
        _business = business;
        _service = service;

        Console.WriteLine("》》》测试数据库动态代理...");

        var db1 = _service.GetService<ILicenseDatabase>();
        var db2 = _service.GetService<ISystemDatabase>();

        //测试授权系统数据库
        var user = db1.GetQueryable<sys_AdminUser>().FirstOrDefault();
        Console.WriteLine("》》》扩展接口:" + typeof(ILicenseDatabase));
        Console.WriteLine(db1.ConnectionString);
        Console.WriteLine("用户名:"+user.AccountName);
        Console.WriteLine();

        //测试开发框架数据库
        var menu = db2.GetQueryable<tb_MyMenu>().FirstOrDefault();
        Console.WriteLine("》》》扩展接口:" + typeof(ISystemDatabase));
        Console.WriteLine(db2.ConnectionString);
        Console.WriteLine("菜单名:" + menu.MenuName);

    }
}

Console输出信息

CSFramework.EF应用 - ASP.NETCore/WebApi使用IDatabase动态代理创建多个数据库实例

 

CSFramework.EF 数据库框架

CSFramework.EF数据库框架支持MySql/Oracle/SqlServer/达梦-开发框架文库

CSFramework.EF是C/S框架网最新发布的轻量级数据库底层框架,基于EntityFrameworkCore 实体框架封装而成。支持三种主流数据库,分别是SqlServer、Oracle、MySQL,支持国产数据库 - 达梦数据库,可扩展其他数据如 PostgreSQL,MongoDB,SQLLite等。

CSFramework.EF数据库框架提供IDatabase通用接口,里面定义了一组通用的接口方法,如增、删、改、查:Add<T>, Update<T>,Remove<T>,GetQuaryable<T>,支持LINQ及SQL脚本查询和操作数据,支持常用事务、BulkInsert批量插入、数据库元数据查询(如查询表结构、数据库列表、表视图列表、存储过程、函数及参数信息)等功能。

CSFramework.EF数据库框架:

https://www.cscode.net/archive/csframework.ef/363596745297925.html

 

footer .net快速开发平台创造卓越品质-开发框架文库

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:EFCore+Oracle根据不同的Schema连接数据库
下一篇:CSFramework.EF 数据库框架支持Oracle+Schema
评论列表

发表评论

评论内容
昵称:
关联文章

CSFramework.EF应用 - ASP.NETCore/WebApi使用IDatabase动态代理创建数据库实例
CSFramework.EF 数据库框架 - 创建数据库实例 IDatabase
如何使用数据库IDatabase接口以及数据访问层应用
CSFramework.EF数据库框架应用Schema测试多种数据库(.NET8+EFCore)
CSFramework.EF 数据库框架 - 获取DbConnection实例
CSFramework.EF数据库初始化
CSFramework.EF数据库框架简介(.NET8+EFCore)
部署ASP.NET Core WebApi应用服务器(IIS .NET7)
IDatabase接口使用事务DbTransaction实例
CS软件授权注册系统-发布/部署WebApi服务器(IIS+.NET8+ASP.NETCore)
[原创] Asp.Net三层体系结构应用实例(2)源代码
CSFramework.DB 应用场景
CSFramework.WebApiV3.CSFramework.EF 组件使用
CSFramework.WebApiV3.CSFramework.EF 组件使用
CSFramework.EF 数据库框架 - 支持达梦数据库
CSFramework.DB数据底层类库(IDatabase/DbDataUpdate)接口测试报告
CSFramework.WebApi V3.0 WebApi开发框架(.NETCore+EFCore)
CSFramework.WebApi V3.0 WebApi开发框架(.NETCore+EFCore)
EF数据库框架:使用DbTypeName创建特殊参数类型(Oracle/MySql数据库
基于透明代理技术创建的WCF实例打开与关闭WCF通道