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数据库框架简介-开发框架文库

相关推荐
数据智能老司机5 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机5 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
“抚琴”的人6 小时前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
松果猿6 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆6 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601016 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy6 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖7 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
FAREWELL000757 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法