C# Core 創建第一個API 項目

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);
        }
    }
}

測試結果:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章