• [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式


    目录

    3.1.8版本增加新功能仓储模式

    Kogel.Repository 作为扩展,现实了通用仓储层功能。与其他规范标准一样,仓储层也有相应的规范定义

    1.安装

    使用仓储模式需要安装扩展包Kogel.Repository,可在Nuget上搜索最新版本

    或者使用Nuget命令

    dotnet add package Kogel.Repository

    2.定义

    public class TestRepository : BaseRepository<Comment>//Comment为实体类
        {
            public override void OnConfiguring(RepositoryOptionsBuilder builder)
            {
                builder
                    .BuildConnection(x=> new MySqlConnection("Server=localhost;Database=Qx_Sport_Common;Uid=root;Pwd=123456;"))
                    .BuildConnection(x=> new MySqlConnection("Server=localhost;Database=Qx_Sport_Common_2;Uid=root;Pwd=123456;"),"Qx_Sport_Common_2")//配置连接方式(可以配置多数据库)
                    .BuildProvider(new MySqlProvider());//配置数据库提供者
    
            }
        }
    
    

    用此方法可以根据自身需求配置多数据库 (内部自带连接池)

    在.net core中有更加简便的注入方式

    //动态注入实体到仓储
        services.AddKogelRepository((kogel) =>
                {
                    kogel.BuildConnection(x => new MySqlConnection(@"数据库连接字符串"));
                    kogel.BuildProvider(new MySqlProvider());
                });

    使用

    IRepository<FlowOrder> repository;
            public ValuesController(IRepository<FlowOrder> repository)
            {
                this.repository = repository;
            }
            // GET api/values
            [HttpGet]
            public ActionResult<object> Get()
            {
                return repository.FindById(4);
            }

    或者使用函数注册连接方式

    //全局只需注册一次
    RepositoryOptionsBuilder.RegisterDataBase(x=>new MySqlConnection("Server=localhost;Database=Qx_Sport_Common;Uid=root;Pwd=123456;")
    ,"连接别名");

    3.使用方法

    1.支持原生Kogel.Dapper.Extension的方法

    using (TestRepository testRepository = new TestRepository())
          {
                    var querySet = testRepository.QuerySet();//查询对象
                    var commandSet = testRepository.CommandSet();//执行对象
         }

    或者使用事务中的Orm属性

    using (TestRepository testRepository = new TestRepository())
                {
                    var comment = testRepository.Orm.QuerySet<Comment>().ToList();
                }

    此Orm属性相当于仓储使用的IDbConnection

    还支持基础的增删改查

    /// <summary>
    		/// 根据主键获取当前实体数据
    		/// </summary>
    		/// <returns></returns>
    		T FindById(int id);
    		/// <summary>
    		/// 增加
    		/// </summary>
    		/// <returns></returns>
    		int Insert(T entity);
    		/// <summary>
    		/// 删除(根据主键)
    		/// </summary>
    		/// <returns></returns>
    		int Delete(int id);
    		/// <summary>
    		/// 修改(根据主键)
    		/// </summary>
    		/// <returns></returns>
    		int Update(T entity);
    

    还可以使用自定义仓储对象

      //自定义仓储释放时 conn也会释放
                using (var divReposirory = conn.QuerySet<FlowOrder>().GetRepository())
                {
                    //使用自定义仓储查询
                    var flowOrder = divReposirory.FindById(1);
                }

    使用仓储时如果配置了多数据库可以通过ChangeDataBase切换数据库(只在当前仓储中生效)

    例如 

     using (var repository = new TestRepository())
                {
                    var data = repository.QuerySet()
                      .Where(x => x.DeliveredTime.HasValue && x.CustomerCode == "test")
                      .Get();
    
                    //切换数据库
                    repository.ChangeDataBase("Qx_Sport_Common_2");
    
                    var dataList = repository.QuerySet()
                        .Where(x => x.DeliveredTime.HasValue && x.CustomerCode.StartsWith("test"))
                        .Top(10)
                        .ToList();
    
                    //第一个配置的连接,如果没有设置别名就为master
                    repository.ChangeDataBase("master");
    
                    dataList = repository.QuerySet()
                      .Where(x => x.DeliveredTime.HasValue && x.CustomerCode == "test")
                      .Top(10)
                      .ToList();
                }

    2.UnitOfWork

    UnitOfWork 可将多个数据库操作放在一个单元管理执行,最终通用 Commit 执行所有操作,内部采用了数据库事务;

    例如

    using (TestRepository testRepository = new TestRepository())
                {
                    //开始事务
                    testRepository.UnitOfWork.BeginTransaction(() =>
                    {
                        var comment = testRepository.Orm.QuerySet<Comment>().ToList();
    
                        testRepository.Orm.CommandSet<Comment>()
                            .Where(x => x.Id == comment.FirstOrDefault().Id)
                            .Update(comment.FirstOrDefault());
                        //其他仓储类代码块
                        new TestRepositoryQuery1().Test();
                    });
                    //提交
                    testRepository.UnitOfWork.Commit();
                }

           其他仓储类的代码块也会进入此单元管理的事务中,因为他们都将会用指定方(testRepository)开启的IDbConnectionIDbTransaction并且如果事务

    中的代码块异常,会第一时间回滚并且抛出异常

           如果工作单元事务中存在其他数据库连接方式(根据连接字符串判断)的查询编辑语句,则会使用自身的连接和事务不会用指定方(testRepository)开启

    IDbConnectionIDbTransaction

    框架开源,完整框架源码可以去Github上下载:

    https://github.com/a935368322/Kogel.Dapper.Extension

    如有问题也可以加QQ群讨论:

    技术群 710217654

  • 相关阅读:
    联赛前第五阶段总结
    陶陶摘苹果 —— 线段树维护单调栈
    联赛前第三阶段总结
    联赛前第四阶段总结
    [NOIP
    超级跳马 —— 矩阵快速幂优化DP
    我的博客园美化
    Wedding —— 2-SAT
    C++运算符优先级
    water——小根堆+BFS
  • 原文地址:https://www.cnblogs.com/kogel/p/11859239.html
Copyright © 2020-2023  润新知