本篇实现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格式返回用户列表信息给客户端,需要先将UserDao中的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();
第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 public 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>();就可以了。