CSFramework.EF应用 - ASP.NETCore/WebApi使用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 数据库框架
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
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
CSFramework.EF C/S框架网