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

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

目录

内容简介

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

从容器中获取实例:

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接口)

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

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

注入IDatabase扩展接口

//注入授权系统数据库
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 扩展方法

        /// <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包:

<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 配置文件

{
  "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 数据库框架

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数据库框架:

CSFramework.EF数据库框架简介-开发框架文库

相关推荐
软件黑马王子3 小时前
Unity游戏制作中的C#基础(5)条件语句和循环语句知识点全解析
游戏·unity·c#
shepherd枸杞泡茶3 小时前
第3章 3.3日志 .NET Core日志 NLog使用教程
c#·asp.net·.net·.netcore
山猪打不过家猪3 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
csdn_aspnet3 小时前
ASP.NET Core 简单文件上传
asp.net·.netcore
qwy7152292581634 小时前
13-R数据重塑
服务器·数据库·r语言
Bio Coder4 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
钊兵5 小时前
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
数据库·mysql·postgresql·oracle·达梦·驱动
weixin_425878236 小时前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
左灯右行的爱情6 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis