一、知识储备
ASP.NET Core创建Web API 基础内容说明https://coffeemilk.blog.csdn.net/article/details/120487169ASP.NET Core创建Web API---接口说明文档(Swagger)
https://coffeemilk.blog.csdn.net/article/details/120563736ASP.NET Core 3.1中使用JWT权限认证
https://coffeemilk.blog.csdn.net/article/details/120727590
二、内容概要
2.1、基础核心
2.2、各层级的简介和调用关系
1、Api模块【对应WebApi中Controller下的所有内容】;实体模块【数据、表实体】可提供对外暴露。
2、仓储模块【可以看做是一个数据库管理人员,直接对数据库、实体层进行操作】(一般包含:BaseRepository[基类仓储]继承实现接口 IBaseRepository[该接口存放公共方法] ,AdvertisementRepostitory 继承 BaseRepository<Advertisement>, IAdvertisementRepository)。
注意:
①仓储的官方定义是【仓储是一个管理者,去管理实体对象和ORM[对象关系映射(Object Relational Mapping)]映射对象的一个集合】(是ORM操作db[数据库(database)])而Dal就是完完全全的操作数据库了;
②仓储是一种模式,可以单建一层,也可以放到基础设施层(而Dal[数据访问层(Data Access Layer)]是三层架构中的某一层,是一种架构);
③仓储表示的更多是一个集合【即:一个仓储 = 一个聚合 = 有一个聚合根 = 一个微服务】;多个微服务之间的交互就是通过聚合根来实现的。
3、服务模块【处理业务逻辑,可直接使用ViewModel视图模型】(BaseService 调用BaseRepository,同时继承 IBaseService ;AdvertisementServices 继承 BaseServices<Advertisement>, IAdvertisementServices)。
三、基础项目搭建
3.1、创建Model实体
①【Models文件夹中,存放的是整个项目中数据库表实体类】,本章内容目前是手动创建,后面会使用SqlSugar的T4创建。
②【ViewModels文件夹中,存放的是DTO(就是数据传输对象(Data Transfer Object))实体类】在开发中,一般接口需要接收数据,返回数据,不能直接使用数据库实体类接收(因为弊端很大,比如会把重要信息泄露出,本章内容目前是手动创建,后面会引用AutoMapper来自动转换。
③最后是MessageModel和TableModel,主要是用在前端接口中,因为在前端接口中,需要固定的格式,以及操作,不能把数据直接发出去,会报错。
/// <summary>
/// 通用返回信息类
/// </summary>
public class MessageModel<T>
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 返回数据集合
/// </summary>
public List<T> Data { get; set; }
}
3.2、设计仓储接口及其实现类
创建【IRepository】和【Repository】仓储层。
仓储层(Repository) 是管理数据库持久层的,主要负责数据的CRUD(Create、Read、Update、Delete)业务逻辑;仓储层是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。
①创建【IAdvertisementRepository】仓储接口,想要实现求和。
/***
* Title:"WebApi" 项目
* 主题:广告仓储接口
* Description:
* 功能:实现求和
* Date:2021
* Version:0.1版本
* Author:Coffee
* Modify Recoder:
*/
namespace IRepository
{
public interface IAdvertisementRepository
{
int Sum(int i, int j);
}//Interface_end
}
②创建【AdvertisementRepository】仓储实现类,实现求和功能
/***
* Title:"WebApi" 项目
* 主题:广告仓储实现
* Description:
* 功能:实现求和
* Date:2021
* Version:0.1版本
* Author:Coffee
* Modify Recoder:
*/
using IRepository;
namespace Repository
{
public class AdvertisementRepository : IAdvertisementRepository
{
public int Sum(int i, int j)
{
return i + j;
}
}//Class_end
}
3.3、设计服务接口及其实现类
创建【IServices】和【Services】服务层(处理业务逻辑)。
服务层只负责将Respository仓储层的数据进行调用,至于如何是域数据库交互的,它不去管,这样就可以达到一定程度上的解耦,加入以后要更换数据库(如:MySql)那Service层就完全不需要修改即可,至于真正意义上的解耦,需要靠依赖注入。
①创建【IAdvertisementServices】服务接口,想要实现求和
/***
* Title:"WebApi" 项目
* 主题:广告服务接口
* Description:
* 功能:实现求和
* Date:2021
* Version:0.1版本
* Author:Coffee
* Modify Recoder:
*/
namespace IServices
{
public interface IAdvertisementServices
{
int Sum(int i, int j);
}//Interface_end
}
②创建【AdvertisementServices】服务实现类,实现具体求和功能
/***
* Title:"WebApi" 项目
* 主题:广告服务实现
* Description:
* 功能:实现求和功能
* Date:2021
* Version:0.1版本
* Author:Coffee
* Modify Recoder:
*/
using IRepository;
using IServices;
using Repository;
namespace Services
{
public class AdvertisementServices : IAdvertisementServices
{
IAdvertisementRepository dal = new AdvertisementRepository();
public int Sum(int i, int j)
{
return dal.Sum(i, j);
}
}//Class_end
}
3.4、创建Controller接口
手动添加一个Controller控制器,可以选择一个空的,也可以选择一个带有默认读写实例的。如下:
/***
* Title:"WebApi" 项目
* 主题:广告控制器
* Description:
* 功能:求和功能Api
* Date:2021
* Version:0.1版本
* Author:Coffee
* Modify Recoder:
*/
using IServices;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Test_NETCoreWebAPI.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Policy = "AdminOrUser")]
public class AdvertisementController : ControllerBase
{
// GET: api/<AdvertisementController>
//Sum接口
[HttpGet]
public IEnumerable<string> Get(int i,int j)
{
return new string[] { "value1", "value2" };
}
/// <summary>
/// 广告的Sum方法
/// </summary>
/// <param name="i">参数i</param>
/// <param name="j">参数j</param>
/// <returns></returns>
[HttpGet("{i},{j}")]
public int GetSum(int i,int j)
{
IAdvertisementServices advertisementServices = new AdvertisementServices();
return advertisementServices.Sum(i,j);
}
// POST api/<AdvertisementController>
[HttpPost]
public void Post([FromBody] string value)
{
}
// PUT api/<AdvertisementController>/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/<AdvertisementController>/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
}
四、运行测试
4.1、使用实时监测项目修改的方式运行项目
①打开Controller文件夹所在的Web Api文件夹目录,比如我这里的WebApi项目路径是【E:\AllProjects\AllTestProjects\C#\Test_NETCoreWebAPI\Test_NETCoreWebAPI】,则在该地址中直接输入命令【CMD】打开终端。
②在终端中输入实时监测启动程序命令【dotnet watch run】后按下Enter即可启动
4.2、测试接口
这里提示没有权限,我们可以手动获取Token输入,然后再运行测试,如下所示:
首先获取Token
然后注入Token
最后运行测试求和的Web Api接口