首页 > 数据库 >SqlSugar 多数据源的简单封装

SqlSugar 多数据源的简单封装

时间:2024-07-29 17:50:34浏览次数:15  
标签:BaseDbClient 封装 数据源 void context new Ado public SqlSugar

参考SqlSugar的官网文档,我自己封装了一个支持多数据库的UnitOfWork 的 SqlSugar 封装类,直接使用SqlSugar的仓储操作

如下:

 /// <summary>
 /// 数据库实例基类
 /// </summary>
 public abstract class BaseDbClient
 {
    
     /// <summary>
     /// 获取数据库客户端实例。
     /// </summary>
     public virtual SugarUnitOfWork UnitOfWorkCilent { get; }
     public virtual IAdo Ado { get; }
     public virtual AopProvider Aop { get; }

     /// <summary>
     /// 基类构造函数,初始化数据库客户端实例。
     /// </summary>     
     /// <param name="connectionString">数据库连接字符串。</param>
     /// <param name="dbType">数据库类型。</param>     
     /// <param name="isTran">是否默认开启事务。</param>
     protected BaseDbClient(string connectionString, DbType dbType,  bool isTran = false)
     {
         var db = new SqlSugarClient(new ConnectionConfig
         {
             ConnectionString = connectionString,
             DbType = dbType,
             IsAutoCloseConnection = true,
             InitKeyType = InitKeyType.Attribute
         });

         UnitOfWorkCilent = db.CreateContext(isTran);
         Ado = db.Ado;
         Aop = db.Aop;

     }

 }
BaseDbClient

 

 /// <summary>
 /// 多个数据源使用只需要写多个class 去继承BaseDbClient 即可,注意数据库类型
 /// </summary>
 public class TestDb : BaseDbClient
 {
     public TestDb(string connectionString, DbType dbType, bool isTran = false) : base(connectionString, dbType, isTran)
     {
     }
 }
TestDb

 

 /// <summary>
 /// 泛型接口定义工作单元模式,用于管理仓储和事务
 /// </summary>
 /// <typeparam name="TContext">工作单元所需的DbContext类型</typeparam>
 public interface IUnitOfWork<TContext> : IDisposable where TContext : BaseDbClient
 {

     /// <summary>
     /// Ado 操作
     /// </summary>
     IAdo Ado { get; }
     AopProvider Aop { get; }
     /// <summary>
     /// 获取特定实体类型的仓储
     /// </summary>
     ISimpleClient<TEntity> Repository<TEntity>() where TEntity : class, new();

     /// <summary>
     /// 开始事务
     /// </summary>
     void BeginTran();


     /// <summary>
     /// 提交事务
     /// </summary>
     void Commit();
     void UnitOfWorkCommit();

     /// <summary>
     /// 回滚事务
     /// </summary>
     void Rollback();


 }

 /// <summary>
 /// 实现工作单元模式的基本功能
 /// </summary>
 /// <typeparam name="TContext">工作单元所需的DbContext类型</typeparam>
 public class UnitOfWork<TContext> : IUnitOfWork<TContext> where TContext : BaseDbClient
 {

     private bool _disposed;
     private TContext _context;
     LoggerHelper<TContext> _loggerHelper;
     /// <summary>
     /// 构造函数
     /// </summary>
     /// <param name="context">工作单元所需的DbContext实例</param>
     public UnitOfWork(TContext context, LoggerHelper<TContext> loggerHelper)
     {
       
         _context = context;
         _loggerHelper = loggerHelper;
         _context.Aop.OnLogExecuting = (sql, pars) =>
         {
             var logContent = sql + "\r\n" + context.Ado.Context.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value));               
             _loggerHelper.Debug(logContent); // 使用公共日志记录工具
         };
     }

     public IAdo Ado { get => _context.Ado; }
     public AopProvider Aop { get => _context.Aop; }

     public ISimpleClient<TEntity> Repository<TEntity>() where TEntity : class, new()
     {
         return _context.UnitOfWorkCilent.GetRepository<TEntity>();
     }

     /// <inheritdoc/>
     public void BeginTran()
     {
         Ado.BeginTran();
     }



     /// <inheritdoc/>
     public void Commit()
     {
         Ado.CommitTran();
     }

     public void UnitOfWorkCommit()
     {
         _context.UnitOfWorkCilent.Commit();
     }

     /// <inheritdoc/>
     public void Rollback()
     {
         Ado.RollbackTran();
     }

     /// <inheritdoc/>
     public void Dispose()
     {
         if (!_disposed)
         {
             Ado.Dispose();
             _disposed = true;
         }

         GC.SuppressFinalize(this);
     }


 }
UnitOfWork
static void Main(string[] args)
{
    LoggerHelper<TestDb> loggerHelper = new LoggerHelper<TestDb>(); //建议依赖注入
    TestDb testDb = new TestDb("Server=.;Database=mdata;User Id=root;Password=root;", DbType.MySql);
    IUnitOfWork<TestDb> unitOfWork = new UnitOfWork<TestDb>(testDb, loggerHelper); //可以做多数据源同时crud
    var dt = unitOfWork.Ado.GetDataTable("select * from test");
    var list = unitOfWork.Repository<Test>().GetList();
    try
    {
        unitOfWork.BeginTran();
        unitOfWork.Repository<Test>().Insert(new Test());
        unitOfWork.Commit();
    }
    catch (Exception ex)
    {
        unitOfWork.Rollback();
        throw ex;
    }
}
示例代码

 

标签:BaseDbClient,封装,数据源,void,context,new,Ado,public,SqlSugar
From: https://www.cnblogs.com/INetIMVC/p/18330676

相关文章

  • sharding-jdbc 兼容 MybatisPlus的动态数据源
    背景:之前的项目做读写分离的时候用的MybatisPlus的动态数据做的,很多地方使用的@DS直接指定的读库或者写库实现的业务;随着表数据量越来越大,现在打算把比较大的表进行水平拆分,准备使用ShardingJDBC实现,但是发现两者配合起来并不是那么顺利,网上大部分文章都是直接把整个Sharding的......
  • 面向对象编程(2)——封装
    目录一、概念1.1主要特点1.2实例二、封装的内容2.1 属性(数据成员)2.2 方法(成员函数)2.3 实现细节2.4 类的依赖关系2.5示例2.5.1示例2.5.2解释三、原则与注意事项3.1 封装的原则3.2注意事项一、概念        封装(Encapsulation)是面向对象编程......
  • yii2代码封装
    1、批量更新某个字段/***@throwsCDbException*@throwsCException*updatexxxTablesetcolumn1=casepk*whenwhenData1thencaseData1*...*END*whereidin(1,2,3...)*/publicfunctionbatc......
  • 使用vite创建react项目并进行初始化(仓库、路由、封装)
    前言学的时候都是跟着教程进行创建,后面发现自己写项目的时候记不住需要做什么,所以现在写一篇来给自己总结一下。(后面忘了也不用翻视频了,直接照着抄答案)只写流程,没有理论。这是我写的习惯,只具备一定通用性,有需要可参考。创建项目npmcreatevite@latestHireSpherenpmins......
  • 使用pybind11封装c++的dll,供python调用
    用pip安装好pybind11 文件清单,都写在一个目录里//文件名:add.cppextern"C"doubleadd(doublein1,doublein2){returnin1+in2;}//文件名:sub.cppextern"C"doublesub(doublein1,doublein2){returnin1-in2;}//文件名:mul.cppextern"......
  • 一文彻底搞懂浏览器事件机制、事件委托、事件冒泡、事件循环、Event Loop、react事件
    一、事件是什么?事件模型?事件是用户操作网页时发生的交互动作,比如click/move,事件除了用户触发的动作外,还可以是文档加载,窗口滚动和大小调整。事件被封装成一个event对象,包含了该事件发生时的所有相关信息(event的属性)以及可以对事件进行的操作(event的方法)。事件是用......
  • 异步操作的华尔兹,Promise详解,在ArkTs如何正确使用?如何使用Promise去封装Sqlite数据库
    目录1.什么是Promise2.Promise中的基本概念3.理解Promise4.Promise的重要方法5.实战我们可以使用Promise去封装一个Splite1.什么是PromisePromise是一种用于异步编程的模式,它提供了一种优雅的方式来处理异步操作的结果,避免了回调地狱问题。在Promise中,每一个Promis......
  • redis工具类封装,redis的使用方式新增修改删除等,
    publicclassRedisUtil{@ResourceprivateRedisTemplate<String,Object>redisTemplate;privateHashOperations<String,String,Object>hashOperations;publicRedisUtil(RedisTemplate<String,Object>redisTemplate){......
  • 鸿蒙 HarmonyOS axios封装
    ✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)......
  • SpringBoot + MyBatis 实现 MySQL 主从复制动态数据源切换
    概述在项目中的某些场景中,需要对数据库进行一些优化。常用的有如下的实现方法:读写分离、引入缓存技术、主从复制、分库分表等。今天来简单介绍一些如何在程序中实现动态切换数据源,可能某台服务器性能比较好,让流量多的方法执行切换到此数据源去操作等等。当然这种思想也可以扩展......