上一節講了類庫添加一些底層的基本封裝,下面來添加實體和倉儲
1、Entities文件夾添加一個實體類Users,繼承BaseModel,即擁有BaseModel的主鍵

1 using System; 2 3 namespace Dinner.Dapper.Entities 4 { 5 public class Users : BaseModel 6 { 7 /// <summary> 8 /// 用戶名 9 /// </summary> 10 public string UserName { get; set; } 11 12 /// <summary> 13 /// 密碼 14 /// </summary> 15 public string Password { get; set; } 16 17 /// <summary> 18 /// 性別(0女,1男) 19 /// </summary> 20 public int Gender { get; set; } 21 22 /// <summary> 23 /// 出生年月日 24 /// </summary> 25 public DateTime Birthday { get; set; } 26 27 /// <summary> 28 /// 創建日期 29 /// </summary> 30 public DateTime CreateDate { get; set; } 31 32 /// <summary> 33 /// 是否刪除(0正常,1刪除) 34 /// </summary> 35 public int IsDelete { get; set; } 36 } 37 }
2、IRepository中添加一個IUsersRepository倉儲接口,注意倉儲接口的寫法規范 I+實體名+Repository,對應的倉儲業寫法貴方 實體名+Repository,這么寫不僅是日常規范更是為后面的依賴注入做鋪墊
繼承自IRepositoryBase<Users> 這個泛型接口,如果你還要定義其他操作,應該自定義接口的新操作方法,然后在實現類中實現自定義的方法

1 using Dinner.Dapper.Entities; 2 using System; 3 using System.Collections.Generic; 4 using System.Threading.Tasks; 5 6 namespace Dinner.Dapper.IRepository 7 { 8 public interface IUserRepository : IRepositoryBase<Users> 9 { 10 #region 擴展的dapper操作 11 12 //加一個帶參數的存儲過程 13 string ExecExecQueryParamSP(string spName, string name, int Id); 14 15 Task<List<Users>> GetUsers(); 16 17 Task PostUser(Users entity); 18 19 Task PutUser(Users entity); 20 21 Task DeleteUser(Guid Id); 22 23 Task<Users> GetUserDetail(Guid Id); 24 25 #endregion 26 } 27 }
3、Repository中添加一個UserRepository接口實現類繼承自RepositoryBase<Users>, IUserRepository

1 using Dapper; 2 using Dinner.Dapper.Entities; 3 using Dinner.Dapper.IRepository; 4 using System; 5 using System.Collections.Generic; 6 using System.Data; 7 using System.Threading.Tasks; 8 9 namespace Dinner.Dapper.Repository 10 { 11 public class UserRepository : RepositoryBase<Users>, IUserRepository 12 { 13 public async Task DeleteUser(Guid Id) 14 { 15 string deleteSql = "DELETE FROM [dbo].[Users] WHERE Id=@Id"; 16 await Delete(Id, deleteSql); 17 } 18 19 public string ExecExecQueryParamSP(string spName, string name, int Id) 20 { 21 using (IDbConnection conn = DataBaseConfig.GetSqlConnection()) 22 { 23 DynamicParameters parameters = new DynamicParameters(); 24 parameters.Add("@UserName", name, DbType.String, ParameterDirection.Output, 100); 25 parameters.Add("@Id", Id, DbType.String, ParameterDirection.Input); 26 conn.Execute(spName, parameters, null, null, CommandType.StoredProcedure); 27 string strUserName = parameters.Get<string>("@UserName"); 28 return strUserName; 29 } 30 } 31 32 public async Task<Users> GetUserDetail(Guid Id) 33 { 34 string detailSql = @"SELECT Id, UserName, Password, Gender, Birthday, CreateDate, IsDelete FROM [dbo].[Users] WHERE Id=@Id"; 35 return await Detail(Id, detailSql); 36 } 37 38 public async Task<List<Users>> GetUsers() 39 { 40 string selectSql = @"SELECT Id, UserName, Password, Gender, Birthday, CreateDate, IsDelete FROM [dbo].[Users]"; 41 return await Select(selectSql); 42 } 43 44 public async Task PostUser(Users entity) 45 { 46 string insertSql = @"INSERT INTO [dbo].[Users](Id, UserName, Password, Gender, Birthday, CreateDate, IsDelete) VALUES(@Id, @UserName, @Password, @Gender, @Birthday, @CreateDate, @IsDelete)"; 47 await Insert(entity, insertSql); 48 } 49 50 public async Task PutUser(Users entity) 51 { 52 string updateSql = "UPDATE [dbo].[Users] SET UserName=@UserName, Password=@Password, Gender=@Gender, Birthday=@Birthday, CreateDate=@CreateDate, IsDelete=@IsDelete WHERE Id=@Id"; 53 await Update(entity, updateSql); 54 } 55 } 56 }
Dapper就是寫純Sql語句的,這很考驗Sql功底,不像EF那樣,寫幾個Linq就解決了,不過視圖,函數,存儲過程都是通用的,Dapper可以,EF也可以
這個Dapper的數據庫和表需要你自己創建,不比EF可以自動生成
上面建的實體,倉儲接口和倉儲實現都是為了演示而已,你們若想添加其他實體,倉儲就自定義添加,不過一定要遵循命名規范。
下一節我們轉到Web Api層,來實現倉儲的依賴注入
源碼地址: https://github.com/wangyulong0505/Dinner