[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

posted @ 2019-11-15 09:44  Kogel  阅读(33148)  评论(0编辑  收藏  举报