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

 

posted @ 2021-01-26 19:44  屏风马  阅读(2136)  评论(0编辑  收藏  举报