使用DapperSimpleCRUD对Repository层进行封装

      通过前面的两篇文章使用Dapper操作Mysql数据库使用Dapper进行参数化查询,大致介绍了Dapper的一些基本操作和简单使用,在实际的使用当中,我们可以把项目简单的分为MVC+Service层+Repository层,Repository 是一个独立的层,在这里我们简单的把它当作 DAO 来看待,结合   DapperSimpleCRUD 提供数据的CRUD操作;但在领域驱动设计中,我们应该采用面向集合的方式,而不是面向数据访问的方式设计仓储。这有助于你将自己的领域当作模型来看待,而不是 CRUD 操作。

      DapperSimpleCRUD  是针对Dapper进行的扩展,通过简单的配置把数据表与实体模型进行匹配,达到对象和数据库之间映射;你可以通过gtihub下载引用,也可以直接在nuget上直接引用。

      我们实际操作一下

      1、创建Car表,包含Id,Car_Id,Create_Time三列,创建对应的实体模型;务必添加[Table]和[Key]标签, DapperSimpleCRUD 才能获取到实体对象对应的数据库表和主键

      

    /// <summary>
    /// UserInfo表实体对象映射
    /// </summary>
    [Table("UserInfo")]
    public class UserInfo
    {
        [Key]
        public string Id { get; set; }
        public string User_Name { get; set; }
        public int Enable { get; set; }
    }

      2、创建泛型接口 IBaseRepository,定义你需要的基本数据操作  

 /// <summary>
    /// 接口层Device
    /// </summary>
    public interface IBaseRepository<T>
    {
        #region  成员方法
        /// <summary>
        /// 增加一条数据
        /// </summary>
        bool Add(T model);
        /// <summary>
        /// 根据ID删除一条数据
        /// </summary>
        bool Delete(int Id);
        /// <summary>
        /// 根据条件删除数据
        /// </summary>
        /// <param name="strWhere"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        bool DeleteList(string strWhere, object parameters);
        /// <summary>
        /// 更新一条数据
        /// </summary>
        bool Update(T model);
        /// <summary>
        /// 根据ID获取实体对象
        /// </summary>
        T GetModel(int Id);
        ///// <summary>
        ///// 根据条件获取实体对象
        ///// </summary>
        //T GetModel(string strWhere, object parameters);
        /// <summary>
        /// 根据条件获取实体对象集合
        /// </summary>
        /// <param name="strWhere"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        IEnumerable<T> GetModelList(string strWhere, object parameters);
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageNum">页码</param>
        /// <param name="rowsNum">每页行数</param>
        /// <param name="strWhere">where条件</param>
        /// <param name="orderBy">Orde by排序</param>
        /// <param name="parameters">parameters参数</param>
        /// <returns></returns>
        IEnumerable<T> GetListPage(int pageNum, int rowsNum, string strWhere, string orderBy, object parameters);
        #endregion

    } 

          3、BaseRepository 实现接口定义

    /// <summary>
    /// 仓储层基类,通过泛型实现通用的CRUD操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseRepository<T> : IBaseRepository<T>
    {
        private IDbConnection _connection;
        #region  成员方法
        /// <summary>
        /// 增加一条数据
        /// </summary>
        public bool Add(T model)
        {
            int? result;
            using (_connection = Utilities.GetOpenConnection())
            {
                result = _connection.Insert<T>(model);           

            }
            if(result>0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 根据ID删除一条数据
        /// </summary>
        public bool Delete(int id)
        {
            int? result;
            using (_connection = Utilities.GetOpenConnection())
            {
                result = _connection.Delete<T>(id);
            }
            if (result > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 按条件删除数据
        /// </summary>
        /// <param name="strWhere"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public bool DeleteList(string strWhere, object parameters)
        {
            int? result;
            using (_connection = Utilities.GetOpenConnection())
            {
                result = _connection.DeleteList<T>(strWhere,parameters);
            }
            if (result > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 更新一条数据
        /// </summary>
        public bool Update(T model)
        {
            int? result;
            using (_connection = Utilities.GetOpenConnection())
            {
                result = _connection.Update<T>(model);
            }
            if (result > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 根据ID获取实体对象
        /// </summary>
        public T GetModel(int id)
        {
            using (_connection = Utilities.GetOpenConnection())
            {
                return _connection.Get<T>(id);
            }        
        }

        /// <summary>
        /// 根据条件获取实体对象集合
        /// </summary>
        public IEnumerable<T> GetModelList(string strWhere, object parameters)
        {
            using (_connection = Utilities.GetOpenConnection())
            {
                return _connection.GetList<T>(strWhere, parameters);
            }
        }
        /// <summary>
        /// 根据条件分页获取实体对象集合
        /// </summary>
        /// <param name="pageNum"></param>
        /// <param name="rowsNum"></param>
        /// <param name="strWhere"></param>
        /// <param name="orderBy"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public IEnumerable<T> GetListPage(int pageNum,int rowsNum, string strWhere, string orderBy,object parameters)
        {
            using (_connection = Utilities.GetOpenConnection())
            {
                return _connection.GetListPaged<T>(pageNum, rowsNum, strWhere, orderBy, parameters); ;
            }
        }


        #endregion
    }

      4、下面User实体对应的Repository类实现如下, DapperSimpleCRUD 通过传入的泛型类型自动完成对象与数据库的关系映射

public class UserInfoRepository : BaseRepository<UserInfo>,IUserInfoRepository
    {
        public UserInfo ValidateUser(string strUser)
        {
            UserInfo user = new UserInfo();
            try
            {
             
                DynamicParameters Parameters = new DynamicParameters();
                string strQuery = "WHERE User_Name=@Name";
                Parameters.Add("Name", strUser);
                return this.GetModelList(strQuery, Parameters).First();
            }
            catch
            {
                return user;
            }
  
     

        }
    }

      上面是对Repository层的一个简单封装,通过 DapperSimpleCRUD对Dapper的扩展,实现对象与数据库的自动映射,可以完成通用的CRUD操作,简化了一些重复性的代码。

 

 

posted @ 2017-10-12 14:13 dafanjoy 阅读(...) 评论(...) 编辑 收藏