通过前面的两篇文章使用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); } ) { return true; } else { return false; } } /// <summary> /// 根据ID删除一条数据 /// </summary> public bool Delete(int id) { int? result; using (_connection = Utilities.GetOpenConnection()) { result = _connection.Delete<T>(id); } ) { 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); } ) { return true; } else { return false; } } /// <summary> /// 更新一条数据 /// </summary> public bool Update(T model) { int? result; using (_connection = Utilities.GetOpenConnection()) { result = _connection.Update<T>(model); } ) { 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操作,简化了一些重复性的代码。