.net5 core webapi項目實戰之五:F1管理員獲取用戶列表編碼實現


本篇實現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}/password 用戶修改密碼
       

 

第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>();就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM