基於NET6平台WebApi嘗鮮項目: 基於最新的.NET6平台,完全拋棄繁雜的接口,采用.NET最經典的三層架構,結合簡化的DDD設計模式... (gitee.com)
倉儲已經成功注入到項目中,接下來我們基於Address來實現簡單的CRUD操作
1、為了更好的開發,我們先定義一個通用的返回結構,並在BaseController中實現幾個實例化方法和一些通用方法,代碼如下
using Microsoft.AspNetCore.Mvc; using NET6.Domain.ViewModels; using Serilog; using System.Security.Claims; namespace NET6.Api.Controllers { /// <summary> /// 控制器基類 /// </summary> //[Authorize] [ApiController] public class BaseController : ControllerBase { protected virtual string? CurrentUserId => HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; protected virtual void Logs(string str) { Log.Error(str); } protected virtual JsonView JsonView(object obj) { return new JsonView { Code = StatusCodes.Status200OK, Msg = "操作成功", Data = obj }; } protected virtual JsonView JsonView(object obj, int count) { return new JsonView { Code = StatusCodes.Status200OK, Msg = "操作成功", Data = obj, Count = count }; } protected virtual JsonView JsonView(string msg) { return new JsonView { Code = StatusCodes.Status400BadRequest, Msg = msg }; } protected virtual JsonView JsonView(bool s) { if (s) { return new JsonView { Code = StatusCodes.Status200OK, Msg = "操作成功" }; } else { return new JsonView { Code = StatusCodes.Status400BadRequest, Msg = "操作失敗" }; } } protected virtual JsonView JsonView(bool s, string msg) { if (s) { return new JsonView { Code = StatusCodes.Status200OK, Msg = msg }; } else { return new JsonView { Code = StatusCodes.Status400BadRequest, Msg = msg }; } } } }
2、我們基於Restful方式為Address創建CRUD方法,代碼如下
using Microsoft.AspNetCore.Mvc; using NET6.Domain.Dtos; using NET6.Domain.Entities; using NET6.Domain.ViewModels; using NET6.Infrastructure.Repositories; using SqlSugar; namespace NET6.Api.Controllers { /// <summary> /// 地址相關接口 /// </summary> [Route("address")] public class AddressController : BaseController { readonly AddressRepository _addressRep; public AddressController(AddressRepository addressRep) { _addressRep = addressRep; } /// <summary> /// 列表 /// </summary> /// <param name="page">當前頁碼</param> /// <param name="size">每頁條數</param> /// <returns></returns> [HttpGet] [ProducesResponseType(typeof(List<AddressView>), StatusCodes.Status200OK)] public async Task<IActionResult> ListAsync(int page = 1, int size = 15) { var query = _addressRep.QueryDto(a => !a.IsDeleted); RefAsync<int> count = 0; var list = await query.OrderBy(a => a.IsDefault).ToPageListAsync(page, size, count); return Ok(JsonView(list, count)); } /// <summary> /// 添加 /// </summary> /// <param name="dto"></param> /// <returns></returns> [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<IActionResult> AddAsync(AddressDto dto) { try { //開啟事務 _addressRep.BeginTran(); var result = await _addressRep.AddAsync(new Address { UserId = CurrentUserId, Name = dto.Name, Phone = dto.Phone, Province = dto.Province, City = dto.City, Area = dto.Area, Detail = dto.Detail, IsDefault = dto.IsDefault }); _addressRep.CommitTran(); if (result > 0) return Ok(JsonView(true)); return Ok(JsonView(false)); } catch (Exception e) { _addressRep.RollbackTran(); Logs("添加異常:" + e.Message); return Ok(JsonView("添加異常")); } } /// <summary> /// 修改 /// </summary> /// <param name="Id">編號</param> /// <param name="dto"></param> /// <returns></returns> [HttpPut("{Id}")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<IActionResult> EditAsync(string Id, AddressDto dto) { try { //開啟事務 _addressRep.BeginTran(); var result = await _addressRep.UpdateAsync(a => a.Id == Id, a => new Address { Name = dto.Name, Phone = dto.Phone, Province = dto.Province, City = dto.City, Area = dto.Area, Detail = dto.Detail, IsDefault = dto.IsDefault }); _addressRep.CommitTran(); if (result) return Ok(JsonView(true)); return Ok(JsonView(false)); } catch (Exception e) { _addressRep.RollbackTran(); Logs("修改異常:" + e.Message); return Ok(JsonView("修改異常")); } } /// <summary> /// 刪除 /// </summary> /// <param name="Id">編號</param> /// <returns></returns> [HttpDelete("{Id}")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<IActionResult> DeleteAsync(string Id) { try { //開啟事務 _addressRep.BeginTran(); var result = await _addressRep.DeleteAsync(a => a.Id == Id); _addressRep.CommitTran(); if (result) return Ok(JsonView(true)); return Ok(JsonView(false)); } catch (Exception e) { _addressRep.RollbackTran(); Logs("刪除異常:" + e.Message); return Ok(JsonView("刪除異常")); } } } }
3、至此,一個基於Address的Restful風格簡單的CRUD接口便開發完成。