当前位置: 首页 > news >正文

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

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

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

目录

  • 内容简介
  • 创建数据库扩展接口(继承IDatabase接口)
  • 注入IDatabase扩展接口
    • AddDatabase 扩展方法
    • UseDatabase 扩展方法
  • 数据库配置文件
    • appsettings.json 配置文件
    • DatabaseOptions 类
  • 功能测试 - 通过动态代理创建多个数据库实例
    • WebApi控制器
    • Console输出信息
  • CSFramework.EF 数据库框架

内容简介

通过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.jsonconfig.UseDatabase<ILicenseDatabase>(dbOption, optionsBuilder: (op) =>{//这个可以设置参数});
});//注入开发框架系统数据库
builder.Services.AddDatabase((config) =>
{var key = "Database:CSFrameworkV6_System";var dbOption = builder.Configuration.GetSection(key).Get<DatabaseOptions>(); //appsettings.jsonconfig.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;elsereturn 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应用 - 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数据库框架:

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

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

相关文章:

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

通过DI依赖注入IDatabase扩展接口&#xff0c;在.NET项目中使用多个数据库实例 目录 内容简介创建数据库扩展接口&#xff08;继承IDatabase接口&#xff09;注入IDatabase扩展接口 AddDatabase 扩展方法UseDatabase 扩展方法数据库配置文件 appsettings.json 配置文件Databas…...

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置&#xff0c;可以仔细看官方文档。 pytorch 官网的库&#xff1a;torch.nn — PyTorch 2.5 documentation Containers库&#xff1a;用来搭建神经网络框架&#xff08;包含所有的神经网络的框架&#xff09;&#xff1b…...

Unity网络框架对比 Mirror|FishNet|NGO

在Unity中制作非单机项目常用的免费网络框架&#xff0c;这里选取了三款比较火的网络框架&#xff0c;Mirror、FishNet和Netcode for GameObject(NGO)。 比较了最常用的免费网络解决方案。可能还有值得探索的付费选项。您需要对此进行自己的研究。数据表格更新日志截止到&#…...

深入了解阿里云 OSS:强大的云存储解决方案

在现代互联网应用中&#xff0c;数据存储是一个不可忽视的环节。随着数据量的不断增长&#xff0c;传统的存储方式已经无法满足高速、低成本、大容量的需求。阿里云 OSS&#xff08;对象存储服务&#xff09;作为一种高性能、低成本且具备高度扩展性的云存储服务&#xff0c;已…...

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible&#xff0c;sh setup.sh 确认安装成功后&#xff0c;编辑hosts文件&#xff08;按步骤逐个添加主机组&#xff0c;不要一开始全部配置好&#xff09; [site-init]下的主机列表为被控制的主机&#xff08;按照当前ai建模方案…...

Qt 2D绘图之四:绘图中的其他问题

参考文章链接: Qt 2D绘图之四:绘图中的其他问题 重绘事件 前面讲到的所有绘制操作都是在重绘事件处理函数paintEvent()中完成的,是QWidget类中定义的函数。一个重绘事件用来重绘一个部件的全部或者部分区域,下面几个原因中的任意一个都会发生重绘事件: repaint()函数或者…...

启动中断函数HAL_TIM_Base_Start_IT()

一、这是定时器中断&#xff1a; 前面的NVIC是我们在正常使能定时器的中断&#xff0c;后面的HAL_TIM_Base_Start_IT(&htim2)才是我们真正启动中断。 启动定时器的中断并不会立刻进入中断函数。它只是启动定时器并使能定时器的中断。中断函数&#xff08;例如 TIM2_IRQHan…...

Docker Buildx 与 CNB 多平台构建实践

一、Docker Buildx 功能介绍 docker buildx 是 Docker 提供的一个增强版构建工具&#xff0c;支持更强大的构建功能&#xff0c;特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。 1.1 主要功能 多平台构建支持 使用 docker buildx&#xff0c;可以在单台设备上构建…...

从Apache Solr 看 Velocity 模板注入

前言 学过 freemaker&#xff0c;学过 Thymeleaf 模板注入&#xff0c;但是还没有学过 Velocity 模板注入&#xff0c;然后学习一个知识最好的方法就是要找一个实际中的例子去学习&#xff0c;好巧不巧&#xff0c;前端时间还在分析 apache solr 的 cve&#xff0c;这次又搜到…...

Spring 事务和事务传播机制

Spring 事务和事务传播机制 一、Spring 事务的基本概念 事务是一组操作&#xff0c;被视为一个不可分割的工作单元&#xff0c;要么全部完成&#xff0c;要么全部失败回滚&#xff0c;以此来确保数据的一致性和完整性。Spring事务管理允许我们在应用程序中声明式地或编程式地…...

flutter 解决webview加载重定向h5页面 返回重复加载问题

long time no see. 如果觉得该方案helps&#xff0c;点个赞&#xff0c;评论打个call&#xff0c;这是我前进的动力~ 通常写法&#xff1a; 项目里用的webview_flutter 正常webview处理返回事件 if (await controller.canGoBack()) {controller.goBack(); } else {Navigator…...

STM32的寄存器是几位的?

STM32的“32”顾名思义就是32位的意思 但是STM32 的寄存器并不都是 32 位的&#xff0c;它们的位宽取决于具体的寄存器和处理器架构。STM32 是基于 ARM Cortex-M 系列内核的微控制器&#xff0c;而这些内核的寄存器通常有不同的位宽。 具体来说&#xff0c;STM32 微控制器的寄…...

基于python的汽车数据爬取数据分析与可视化

一、研究背景 基于提供的代码片段和讨论&#xff0c;我们可以得出一个与网络抓取、数据处理和数据可视化相关的研究背景&#xff0c;该背景涉及到汽车行业。以下是研究背景的陈述&#xff1a; "在迅速发展的汽车行业中&#xff0c;准确和及时的数据对各方利益相关者至关…...

使用mtools搭建MongoDB复制集和分页集群

mtools介绍 mtools是一套基于Python实现的MongoDB工具集&#xff0c;其包括MongoDB日志分析、报表生成及简易的数据库安装等功能。它由MongoDB原生的工程师单独发起并做开源维护&#xff0c;目前已经有大量的使用者。 mtools所包含的一些常用组件如下&#xff1a; mlaunch支…...

Redis(配置文件属性解析)

一、tcp-backlog深度解析 tcp-backlog是一个TCP连接的队列&#xff0c;主要用于解决高并发场景下客户端慢连接问题。配置文件中的“511”就是队列的长度&#xff0c;对联与TCP的三次握手有关&#xff0c;不同的linux内核&#xff0c;backlog队列中存放的元素&#xff08;客户端…...

思维导图+实现一个登录窗口界面

QQ2024122-205851 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel, QVBoxLayout# 封装我的窗口类 class LoginWidget(QWidget):# 构造函数def __init__(self):# 初始化父类su…...

T507 buildroot linux4.9之RTC8563开发调试

文章目录 前言一、硬件确认1.1、RTC8563硬件二、驱动配置2.1、驱动位置2.2、使用config宏配置驱动2.3、DTS配置三、断电重启时间不保存分析四、解决问题五、测试前言 调试T507的RTC8563,解决中调试遇到的问题 一、硬件确认 1.1、RTC8563硬件 通过原理图确认 RTC8563 硬件的…...

网络安全专业术语

网络安全专有名词详解 1.肉鸡 被黑客操控的终端设备&#xff08;电脑、服务器、移动设备等等&#xff09;&#xff0c;黑客可以随心所欲的操作这些终端设备而不会被发觉。 2.木马 表面上伪装成正常的程序&#xff0c;但是当这些程序运行时候就会获取整个系统的控制权限&#…...

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念&#xff1a; RDD&#xff1a; 弹性分布式数据集&#xff1b; DataFrame&#xff1a; DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型…...

zerotier实现内网穿透

zerotier的内网穿透 前言一、zerotier的框架认知二、客户端安装设置1.linux2.windows 前言 摸索了一阵&#xff0c;看了好几篇&#xff0c;没有讲清楚。争取这次说清楚。 一、zerotier的框架认知 先认识一下zerotier的框架&#xff0c;这样如何处理就很好理解了。 首先上zero…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...