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<User> 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<User> Find(int UserId)
{
return await _context.User.FindAsync(UserId);
}
public IEnumerable<User> GetAll()
{
return _context.User;
}
public async Task<User> Remove(int UserId)
{
var user = await _context.User.FindAsync(UserId);
_context.User.Remove(user);
await _context.SaveChangesAsync();
return user;
}
public async Task<User> 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<IEnumerable<User>> GetUser()
{
return new ObjectResult(_userRepository.GetAll());
}
// GET: api/Users/5
[HttpGet("{id}")]
public async Task<ActionResult<User>> 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<IActionResult> 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<ActionResult<User>> PostUser(User user)
{
await _userRepository.Add(user);
return CreatedAtAction("GetUser", new { id = user.UserId }, user);
}
// DELETE: api/Users/5
[HttpDelete("{id}")]
public async Task<ActionResult<User>> DeleteUser(int id)
{
await _userRepository.Remove(id);
return Ok();
}
private bool UserExists(int id)
{
return _userRepository.Exist(id);
}
}
}
測試結果: