C# web api 三层架构

一、结构

1、Controllers

  xxxxController

2、Services

    xxxxService

  Impls

    IxxxxService

3、Entities

二、配置(Program.cs)

#region 注入依赖
// 注入依赖 DI
builder.Services.AddScoped<IPersonService, PersonService>();
#endregion

三、具体代码

1、Controller

using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using WebApi.Entities;
using WebApi.Result;
using WebApi.Services.Impls;

namespace WebApi.Controllers
{
    /// <summary>
    /// 测试类人
    /// </summary>
    [ApiController]
    [Route("test/person")]
    public class PersonController : ControllerBase
    {
        private readonly ILogger _log;
        private readonly IPersonService _service;

        /// <summary>
        /// DI
        /// </summary>
        /// <param name="service"></param>
        /// <param name="log"></param>
        public PersonController(IPersonService service, ILogger<PersonController> log)
        {
            _service = service;
            _log = log;
        }
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        [HttpPost("add")]
        public async Task<ApiResult> Post([FromBody] Person person) 
        {
            await _service.AddAsync(person);

            return ApiResult.Ok();
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="current">当前页码</param>
        /// <param name="size">页码尺寸</param>
        /// <param name="name">姓名</param>
        /// <returns></returns>
        [HttpGet("list")]
        public async Task<ApiResult<PagedResult<Person>>> GetList(
            [FromQuery, Required] int current = 1, 
            [FromQuery, Required] int size = 10, 
            [FromQuery]  string? name = null)
        {
            PagedResult<Person> list = await _service.ListAsync(current, size, name);
            _log.LogError("123");
            return ApiResult<PagedResult<Person>>.Ok(list);
        }


        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id">用户id</param>
        /// <returns></returns>
        [HttpDelete("delete/{id:int}")]
        public async Task<ApiResult> delete([FromRoute] int id)
        {
            bool flag = await _service.RemoveByIdAsync(id);
            if (flag)
                return ApiResult.Ok();
            else
                return ApiResult.Fail(ResultCodeEnum.DataError);
        }


        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        [HttpPut("update")]
        public async Task<ApiResult> update([FromBody] Person person) 
        {
            bool flag = await _service.UpdateAsync(person);
            if (flag)
                return ApiResult.Ok();
            else
                return ApiResult.Fail(ResultCodeEnum.DataError);
        }
        /// <summary>
        /// 根据id获取信息
        /// </summary>
        /// <param name="id">id</param>
        /// <returns></returns>

        [HttpGet("getById")]
        public async Task<ApiResult<Person>> getById([FromQuery] int id) 
        {
            Person person = await _service.GetByIdAsync(id);
            if (person != null)
                return ApiResult<Person>.Ok(person);
            else
                return ApiResult<Person>.Fail(ResultCodeEnum.ParamError);
        }

    }
}

2、IService和Service

IService

using WebApi.Entities;
using WebApi.Result;

namespace WebApi.Services.Impls
{
    /// <summary>
    /// 接口
    /// </summary>
    public interface IPersonService
    {
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        Task<bool> AddAsync(Person person);

        /// 查询///
        Task<PagedResult<Person>>  ListAsync(int pageIndex, int pageSize, string? name);

        /// 删除 ///
        Task<bool> RemoveByIdAsync(int id);

        Task<bool> UpdateAsync(Person person);

        Task<Person> GetByIdAsync(int id);
    }
}

Service

using SqlSugar;
using System.Runtime.InteropServices;
using WebApi.Entities;
using WebApi.Exceptions;
using WebApi.Result;
using WebApi.Services.Impls;

namespace WebApi.Services
{
    /// <summary>
    /// PeersonService
    /// </summary>
    public class PersonService : IPersonService
    {
        private readonly ISqlSugarClient _db;
        /// <summary>
        /// 构造器 DI
        /// </summary>
        /// <param name="db"></param>
        public PersonService(ISqlSugarClient db)
        {
            _db = db;
        }

        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        /// <exception cref="ApiException"></exception>
        public async Task<bool> AddAsync(Person person)
        {
            bool isExist = await _db.Queryable<Person>().AnyAsync((p)=>p.Name == person.Name);
            if (isExist)
            {
                throw new ApiException(ResultCodeEnum.AdminAccountExistError);
            }
            int count = await _db.Insertable(person).ExecuteCommandAsync();

            return count > 0;
        }

        public async Task<Person> GetByIdAsync(int id)
        {
            return await _db.Queryable<Person>().Where(p=>p.Id==id).FirstAsync();
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public async Task<PagedResult<Person>> ListAsync(int pageIndex, int pageSize, string? name)
        {
            RefAsync<int> totalCount = 0;
            var list = await _db.Queryable<Person>()
                .WhereIF(!string.IsNullOrEmpty(name), p => p.Name == name)
                .OrderByDescending(p => p.Id)
                .ToPageListAsync(pageIndex, pageSize, totalCount);
            return new PagedResult<Person> 
            {
                PageIndex = pageIndex,
                PageSize = pageSize,
                TotalCount = totalCount,
                Items = list
            };
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<bool> RemoveByIdAsync(int id)
        {
            return await _db.Deleteable<Person>().Where(p => p.Id == id).IsLogic().ExecuteCommandAsync() >= 1;
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        public async Task<bool> UpdateAsync(Person person)
        {
            return await _db.Updateable(person).ExecuteCommandAsync() >= 1;
        }
    }
}

3、Entity

using SqlSugar;

namespace WebApi.Entities
{
    [SugarTable("tb_person")]
    public class Person : BaseEntity
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string? Name { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
    }
}

 

posted @ 2026-07-14 08:54  市丸银  阅读(6)  评论(0)    收藏  举报