1. 安装VS 2019,SQL Server 2019(Optional)
2. 打开VS,选择新建 ASP.NET Core Web Application 项目
3. 填写项目名称,解决方案名称,修改存放路径等。
4.选择.NET Core 的版本,我们默认选择 3.1,选择 API。
这是创建后默认的目录结构
5.Core 3.1 自带一个名为weatherforecast的api,创建后,我们可以直接运行看看效果,如下:
6. 使用NuGet添加Entity framework core 。 Tools --> NuGet Manager Packager-->Manage NuGet Packages for Solution.
Browse --> Search Microsoft.EntityFrameworkCore.SqlServer--> 勾选项目-->install.
Browse --> Search Microsoft.EntityFrameworkCore.Tools--> 勾选项目-->install.
安装成功后,可以在项目的dependencies 里面查看
7. 在 NuGet Packager Console 里面使用 Scaffold-DbContext 命令创建数据库上下文。
成功以后,会在Models 文件夹中生成Model和DB-Context
打开DB-Context 文件,里面有一个warning,提示建议把数据库连接字符串移出DB-Context。我们把连接字符串放到Stupup.cs文件里。
8. 创建Controller
自动创建
右键Controller, 选择Add,选择 New Scaffolded Item
选择 API Controller Wtih actions,using Entity Framework
选择Model 和DB-Context
在Controller 文件夹里就会生成一个UsersController的 CS文件。里面有对Table Users 的CRUD 操作的方法。
运行项目,可以查看到结果。自此简单的API就创建完成了。
手动创建
右键 Controller, Add --> Controller-->Empty Controller
填写Controller name,必须于Entity的name相同。
编写代码如下:
运行结果如下:
9. postman 测试API
https://localhost:44317/api/TODOITEM/3 3--FromRout
Parms --FromQuery
Headers --FromHeader
Body -- FromBody
如果想传JSON 格式的数据(对象)给API, Header 里面添加请求头:“Content-Type"为"application/json”
"Body"里面,选择"raw",手动输入json格式参数即可。
返回结果如下:
10. 截至到目前为止,我们已经完成的API抽象出模型,可以参考如下。
下面我们将完成Repository Patten 。至于Ropository Patten 的好处嘛,毕竟多封装了一层,在某种程度上讲起到了数据隔离的作用。对于Controller而言,是处理逻辑的, 不应该直接操纵数据。同时也为data cashing的实现提供了一种可能。
11. Repository Patten
12. 创建一个名为DataRepository的文件夹。
在文件夹里创建一个IUsersRepository的接口。
创建 UsersRepository实现上面创建的接口。
修改代码,主要是把Controller 里面的代码移植出来。
UerRepository.cs:
public class UsersRepository : IUsersRepository
{
private NPT_DataHub_DEVContext _context;
public UsersRepository(NPT_DataHub_DEVContext context)
{
_context = context;
}
public async Task Add(User user)
{
await _context.User.AddAsync(user);
await _context.SaveChangesAsync();
return user;
}
public bool Exist(int UserId)
{
return _context.User.Any(user => user.UserId == UserId);
}
public async Task Find(int UserId)
{
return await _context.User.FindAsync(UserId);
}
public IEnumerable GetAll()
{
return _context.User;
}
public async Task Remove(int UserId)
{
var user = await _context.User.FindAsync(UserId);
_context.User.Remove(user);
await _context.SaveChangesAsync();
return user;
}
public async Task Update(User user)
{
_context.User.Update(user);
await _context.SaveChangesAsync();
return user;
}
}
UsersController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using NPT_API_Test.Models;
using NPT_API_Test.DataRepository;
namespace NPT_API_Test.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private readonly IUsersRepository _userRepository;
public UsersController( IUsersRepository usersRepository)
{
_userRepository = usersRepository;
}
// GET: api/Users
[HttpGet]
public ActionResult> GetUser()
{
return new ObjectResult(_userRepository.GetAll());
}
// GET: api/Users/5
[HttpGet("{id}")]
public async Task> GetUser(int id)
{
var user = await _userRepository.Find(id);
if (user == null)
{
return NotFound();
}
return user;
}
// PUT: api/Users/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD.
[HttpPut("{id}")]
public async Task PutUser(int id, User user)
{
if (id != user.UserId)
{
return BadRequest();
}
try
{
await _userRepository.Update(user);
}
catch (DbUpdateConcurrencyException)
{
if (! UserExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Users
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD.
[HttpPost]
public async Task> PostUser(User user)
{
await _userRepository.Add(user);
return CreatedAtAction("GetUser", new { id = user.UserId }, user);
}
// DELETE: api/Users/5
[HttpDelete("{id}")]
public async Task> DeleteUser(int id)
{
await _userRepository.Remove(id);
return Ok();
}
private bool UserExists(int id)
{
return _userRepository.Exist(id);
}
}
}
测试结果: