本篇實現F1功能(見紅色部分)
功能序號 | HTTP謂詞(HTTP verbs) | API | 描述 |
F1 | GET | /api/users |
管理員獲取用戶列表 |
F2 | POST | /api/users |
管理員添加用戶 |
F3 | PATCH | /api/users/{id}/role | 管理員修改用戶角色 |
F4 | PATCH | /api/users/{id}/state | 管理員鎖定/解鎖用戶 |
F5 | GET | /api/users/{id} | 用戶獲取自己的信息 |
F6 | PUT | /api/users/{id} | 用戶更新自己的信息 |
F7 | PATCH | /api/users/{id} |
用戶修改密碼 |
第1步:
要以JSON格式返回用戶列表信息給客戶端,需要先將MySqlUserDao中的List<User>轉換成JSON格式,一個解決方式是寫一個Utility.cs類 , 代碼如下:
1 public static string ListToJson(List<User> list) 2 { 3 if (list == null || list.Count < 1) return "[]"; 4 5 string json = ""; 6 foreach (User user in list) 7 { 8 json += ",{'userid':"+user.UserId+",'nicknm':'"+user.Nickname+"',"+ 9 "'email':'"+user.Email+"','role':"+user.RoleCode+","+ 10 "'state':"+user.StateCode+",'mobile':"+user.Mobile+","+ 11 "'age':"+user.Age+",'regtime':"+user.RegisterTime+"}"; 12 } 13 return "["+json.Substring(1)+"]"; 14 }
調用的時候這樣寫就可以了:
string json = Utility.ListToJson(userList);
但c#3.0帶來的新特性 "擴展方法" 能更優雅的處理這個問題,在Models文件夾下新建一個UserExtension.cs的靜態類,代碼如下:
1 public static class UserExtension 2 { 3 public static string ToJson(this List<User> list) 4 { 5 if (list == null || list.Count < 1) return "[]"; 6 7 string json = ""; 8 foreach (User user in list) 9 { 10 json += "," + user.ToJson(); 11 } 12 13 return "[" + json.Substring(1) + "]"; 14 } 15 16 17 public static string ToJson(this User user) 18 { 19 return "{'userid':" + user.UserId + ",'nicknm':'" + user.Nickname + "'," + 20 "'email':'" + user.Email + "','role':" + user.RoleCode + "," + 21 "'state':" + user.StateCode + ",'mobile':'" + user.Mobile + "'," + 22 "'age':" + user.Age + ",'regtime':'" + user.RegisterTime + "'}"; 23 } 24 }
調用的時候這樣寫就可以了:
string json = userList.ToJson();
擴展方法是對實例的擴展,使用很簡單 , 只需3步:
1.定義一個靜態類;
2.定義一個靜態方法;
3.靜態方法的形參傳入要擴展的實例類型並在前面加上this關鍵字。
第2步:
打開UsersController.cs,在ManageUsers()函數中添加獲取用戶列表的函數,這里有2種編碼方式:
方式一:傳統方式,代碼如下:
1 [HttpGet] 2 public ContentResult ManageUsers() 3 { 4 IUserDao userDao = new MySqlUserDao(); 5 List<User> list = userDao.GetUserList(); 6 7 return Content(list.ToJson()); 8 }
這種方式的特點是,使用MySqlUserDao對象,需要先new一個MySqlUserDao實例后再使用。
在.net core webapi中,我們可以利用框架的依賴注入功能,將MySqlUserDao實例的創建交給框架去完成,
我們只需要將對象間的關系在Startup.cs的ConfigureServices( )方法中注冊一下就可以了,
這樣需要用MySqlUserDao實例的時候,框架會自動幫我們構造出來,框架負責實例的創建和銷毀,同時也實現了解耦,步驟如下:
1 . 先在Startup.cs的ConfigureServices( )方法中將數據庫操作注冊為服務,代碼如下(見紅色代碼行):
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddControllers(); 4 5 services.AddScoped<IUserDao, MySqlUserDao>(); 6 }
2 . 在UsersController.cs中編碼如下:
1 [Route("api/[controller]")] 2 [ApiController] 3 public class UsersController : ControllerBase 4 { 5 private IUserDao _userDao; 6 public UsersController(IUserDao userDao) 7 { 8 _userDao = userDao; 9 } 10 11 12 [HttpGet] 13 public ContentResult ManageUsers() 14 { 15 List<User> list = _userDao.GetUserList(); 16 17 return Content(list.ToJson()); 18 } 19 20 }
上面的代碼中,框架會調用UsersController 的構造函數將對象注入進來賦值給成員變量_userDao,
在ManageUsers()中使用_userDao就可以了,已經看不到New MySqlUserDao( )這樣的代碼了。
和傳統方式相比較,這樣寫似乎更復雜了,但是試想一下,
我們的系統中很多地方都用到了IUserDao userDao = new MySqlUserDao();這樣的代碼,
如果某天要使用OracleUserDao( )去替換MySqlUserDao( )來操作數據庫,程序修改起來是難以想象的,
但是用依賴注入的方式,只要在Startup.cs的ConfigureServices( )方法中將
services.AddScoped<IUserDao, MySqlUserDao>();改成services.AddScoped<IUserDao, OracleUserDao>();就可以了。