面向接口编程:dapper+Repository+autofac基础框架

小弟最近在网上自学仓储模式,自己整理了一个基础的底层框架,来这里记录分享一下。

有什么不好的地方欢迎各位大佬点评指导!!!!!

之前写了一篇发现不太友好,今天又重新发布一篇简单的说一下实现逻辑。

orm框架:dapper,dapper.Contrib(dapper 扩展),dapper的性能有orm之王的称号,具体大家可以网上找资料了解了解。

设计模式:Repository(个人也不太了解仓储模式,有了解大佬可以给小弟上上课)

web:mvc

最后使用autofac依赖注入达到进一步解耦

创建IRepository接口:

 实现Repository接口:

public class DbBaseRepository<T,TKey> : IDbBaseRepository<T, TKey> where T : class , new()
    {
        protected readonly string dbType = ConfigurationManager.AppSettings["DBType"];
        protected IDbSession DbSession => DbConnectionFactory.CreateSession(dbType);

        public virtual List<T> GetAll(bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                return dbSession.Connection.GetAll<T>()?.ToList(); ;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual T GetByKey(TKey id, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                return dbSession.Connection.Get<T>(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual long Insert(T entity, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                long result = 0;
                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Insert(entity, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                    result = dbSession.Connection.Insert(entity, null);

                return result;
            }
            catch (Exception ex)
            {
                if (useTransaction)
                    dbSession.Rollback();
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual bool Update(T entity, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                bool result = false;
                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Update(entity, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                {
                    result = dbSession.Connection.Update(entity, null);
                }

                return result;
            }
            catch (Exception ex)
            {
                if (useTransaction)
                    dbSession.Rollback();
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual bool Delete(T entity, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                bool result = false;
                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Delete(entity, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                {
                    result = dbSession.Connection.Delete(entity, null);
                }

                return result;
            }
            catch (Exception ex)
            {
                if (useTransaction)
                    dbSession.Rollback();
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        //参数化接口
        public virtual int InsertBatch(string sql, List<T> entityList, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                int result = 0;

                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Execute(sql, entityList, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                    result = dbSession.Connection.Execute(sql, entityList, null);
                return result;
            }
            catch (Exception ex)
            {
                if (useTransaction)
                    dbSession.Rollback();
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual int DbParamsCUD(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                int result = 0;

                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Execute(sql, parameters, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                    result = dbSession.Connection.Execute(sql, parameters, null);
                return result;
            }
            catch (Exception ex)
            {
                if (useTransaction)
                    dbSession.Rollback();
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }
       
        public virtual List<T> QueryPagingOrSQL(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                IEnumerable<T> result = null;
                CommandType comType = CommandType.Text;
                if (sql.Contains("dbo.Proc_"))
                    comType = CommandType.StoredProcedure;

                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    result = dbSession.Connection.Query<T>(sql, parameters, dbSession.Transaction, true, null, commandType: comType);
                    dbSession.Commit();
                }
                else
                    result = dbSession.Connection.Query<T>(sql, parameters, dbSession.Transaction, true, null, commandType: comType);

                return result?.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }

        public virtual T QueryEntity(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            IDbSession dbSession = DbSession;
            try
            {
                T entity = null;
                if (useTransaction)
                {
                    dbSession.BeginTrans();
                    entity = dbSession.Connection.QuerySingleOrDefault<T>(sql, parameters, dbSession.Transaction);
                    dbSession.Commit();
                }
                else
                    entity = dbSession.Connection.QuerySingleOrDefault<T>(sql, parameters, null);
                return entity;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dbSession.Dispose();
            }
        }
    }

 

创建IServiceBase接口,主要是封装Repository的接口,个人把它理解成IDAL层 :

新建ServiceBase类实现IServiceBase(DAL):

public abstract class ServiceBase<T, TKey> : IServiceBase<T, TKey> where T : class, new()
    {
        public IDbBaseRepository<T, TKey> baseRepository;

        public virtual List<T> GetAll(bool useTransaction = false)
        {
            return baseRepository.GetAll();
        }

        public virtual T GetByKey(TKey id, bool useTransaction = false)
        {
            return baseRepository.GetByKey(id);
        }

        public virtual long Insert(T entity, bool useTransaction = false)
        {
            return baseRepository.Insert(entity, useTransaction);
        }

        public virtual bool Update(T entity, bool useTransaction = false)
        {
            return baseRepository.Update(entity, useTransaction);
        }

        public virtual bool Delete(T entity, bool useTransaction = false)
        {
            return baseRepository.Delete(entity, useTransaction);
        }

        //参数化接口
        public virtual int InsertBatch(string sql, List<T> entityList, bool useTransaction = false)
        {
            return baseRepository.InsertBatch(sql, entityList, useTransaction);
        }

        public virtual int DbParamsCUD(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            return baseRepository.DbParamsCUD(sql, parameters, useTransaction);
        }
        
        public virtual List<T> QueryPagingOrSQL(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            return baseRepository.QueryPagingOrSQL(sql, parameters, useTransaction);
        }

        public virtual T QueryEntity(string sql, DynamicParameters parameters, bool useTransaction = false)
        {
            return baseRepository.QueryEntity(sql, parameters, useTransaction);
        }

    }

 新建IUserRepository接口:

  public interface IUserRepository : IDbBaseRepository<UserEntity, int>
    {
    }

新建UserRepository类实现IUserRepository接口方法:

public class UserRepository : DbBaseRepository<UserEntity,int>, IUserRepository
    {               
    }

新建IUserService接口:

  public interface IUserService : IServiceBase<UserEntity, int>
    {
        UserEntity GetUser(string account);
        List<UserEntity> GetUserPagingData(string Account, string UserName, int pageIndex, int pageSize, ref int rowsCount, int isLast);
    }

新建UserService类实现IUserService接口方法:

 public class UserService : ServiceBase<UserEntity, int>, IUserService
    {
        IUserRepository _repository;
        public UserService(IUserRepository repository)
        {
            this._repository = repository;
            base.baseRepository = repository;
        }

        public UserEntity GetUser(string account)
        {
            string sql = @"select ID,Account,UserName,English_Name,[PassWord],[Status],Email,Phone,IsEnable,CreateTime,(stuff((
                             SELECT ',' + RoleCode FROM Sys_Role WHERE RoleCode = RoleCode and ID in (select RoleId from Sys_UserRole where UserId = u.ID)
                             FOR XML path('') ), 1, 1, '') ) Roles from Sys_User u where u.Account = @Account and u.IsEnable = 1";

            DynamicParameters dataParams = new DynamicParameters();
            dataParams.Add("@Account", account);
            return QueryEntity(sql, dataParams);
        }

        public List<UserEntity> GetUserPagingData(string Account, string UserName, int pageIndex, int pageSize, ref int rowsCount, int isLast)
        {
            DynamicParameters dataParams = new DynamicParameters();
            dataParams.Add("@Account", Account);
            dataParams.Add("@UserName", UserName);
            dataParams.Add("@pageIndex", pageIndex);
            dataParams.Add("@pageSize", pageSize);
            dataParams.Add("@rowsCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
            dataParams.Add("@IsLast", isLast);

            var result = QueryPagingOrSQL("dbo.Proc_UserConfigPaging", dataParams);
            rowsCount = dataParams.Get<int>("@rowsCount");

            return result;
        }
    }

创建UserEntity :

    [Serializable]
    [Table("Sys_User")]
    public class UserEntity
    {
        public int ID { get; set; }
        public string Account { get; set; }
        public string UserName { get; set; }
        public string English_Name { get; set; }
        public string PassWord { get; set; }

        private string status = "ON";
        public string Status { get { return status; } set { status = value; } }
        public string Email { get; set; }
        public string Phone { get; set; }
        public bool IsEnable { get; set; }
        [Write(false)]
        public virtual string Roles { get; set; }
        public string CreateTime { get; set; }
    }

mvc中使用autofac注入IUserService:

public class Bootstrapper
    {
        public static void AutofacRegister()
        {
            SetAutofacContainer();
        }

        private static void SetAutofacContainer()
        {
            //创建autofac管理注册类的容器实例
            var builder = new ContainerBuilder();
            //为这个容器注册它可以管理的类型
            //builder的Register方法可以通过多种方式注册类型。
            //builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
            //builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();

            //builder.RegisterAssemblyTypes(GetAssemblyByName("R.IRepository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();

            builder.RegisterAssemblyTypes(GetAssemblyByName("R.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();

            builder.RegisterAssemblyTypes(GetAssemblyByName("R.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();            

            //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
            builder.RegisterControllers(Assembly.GetExecutingAssembly());//生成具体的实例
            //如果使用属性注入 就把上面这句改为
            //builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); // 这样支持属性注入
            var container = builder.Build();
            //下面就是使用MVC的扩展 更改了MVC中的注入方式.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        /// <returns></returns>
        public static Assembly GetAssemblyByName(String AssemblyName)
        {
            return Assembly.Load(AssemblyName);
        }
    }

控制器中使用构造注入IUserService,以及简单使用:

只要参考资料:

主要参考资料来自:https://www.cnblogs.com/YUTOUYUWEI/p/10450953.html

代码链接:https://pan.baidu.com/s/11kgI4aXsM7bGzP4A3bVQng 
提取码:8ikf

 以上就是整个框架的结构以及实现,希望与大佬们相互学习共同进步,有写的不好或者需要改进的地方欢迎各位大佬留言点评,指导指导小弟,谢谢!!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值