.NetCore WebApi实战2 控制器
控制器职责
1、请求处理
2、模型验证
3、返回响应
Controllers--控制器
Contracts--合同--接口
Data
--Mappings--映射
--Repositories--仓储库--实现
Entites--实体类
Extensions--拓展
Migrations--迁移
创建控制器类
[Route("api/player")]
public class PlayerController:ControllerBase
特性路由 [Route("api/[controller]")]
不代表当前控制器的名称,可读性不强,不如直接硬编码[Route("api/player")],
类名不会改,看起来直观
必须定义[ApiController]
一、GET请求
返回所有数据
1、先在仓储接口IPlayerRepository中创建 Task<List<Player>> GetAllPlayers();
2、再去仓储库里实现,真正执行查询
public IQueryable<T> FindAll() { return GameDbContext.Set<T>().AsNoTracking(); }
调用RepositoryBase仓储基类中的FindAll方法,此处只是组装表达式,没有ToList
public IQueryable<T> FindAll() { return GameDbContext.Set<T>().AsNoTracking(); }
3、注入控制器,一个仓储适配器,一个logger
public class PlayerController(IRepositoryWrapper repository, IMapper mapper, ILogger<PlayerController> logger) : ControllerBase
4、创建GET方法 IActionResult GetPlayers,要添加HttpGet特性
IActionResult就是为了返回数据+状态码,默认json格式
异步方法
[HttpGet] public async Task<IActionResult> GetPlayers() { try { var players = await repository.Player.GetAllPlayers();//Player可以点出粗体方法是自己类的,不加粗的为仓储基类的都可以调用 return Ok(players);//实现了IActionResult接口,返回200状态码 } catch (Exception ex) { logger.LogError($"{ex.Message}"); return StatusCode(500); } }
webapi是特性路由,方法路由默认继承控制器的路由
HttpGet]特性就会访问Get请求
启用Swagger调试工具
启动会打开Swagger,同域调用,same-origin,不是跨域
添加Swashbuckle.AspNetCore.Swagger包,Swashbuckle.AspNetCore.SwaggerUI包
添加服务
Swashbuckle.AspNetCore.SwaggerGen
应用swagger
if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); }
修改Properties/launchSettings.json文件中
profiles节点的launchUrl启动地址weatherforecast为swagger
仓储包装器
RepositoryWrapper.cs只会在get的时候才会被实例化,
构造的时候不会实例化,只是用到哪个用哪个,不存在资源浪费,不会一上来全部实例化
按需实例化,同一个上下文
第二次就不会实例化了,用原有的数据了
浙公网安备 33010602011771号