一、控制器是什么?
微软定义:控制器用于对一组操作进行定义和分组。 操作(或操作方法)是控制器上一种用来处理请求的方法。 控制器按逻辑将类似的操作集合到一起。 通过这种操作的聚合,可以共同应用路由、缓存和授权等通用规则集。 请求通过路由映射到操作。 控制器按请求激活和释放。
个人理解:基于上篇对最小API的对比,不难发现直接使用app.MapGet等路由方法太过随便,使用控制器方法更为集中管理。
二、使用步骤
1.添加服务
在app对象中,添加控制器服务,再启动路由映射
代码如下(示例):
var builder = WebApplication.CreateBuilder(args);
// 服务添加控制器
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
// 映射路由
app.MapControllers();
app.Run();
2.创建控制器类
在控制器类上添加[ApiController]属性,然后再继承ControllerBase基类
代码如下(示例):
[ApiController]
public class ShirtsController : ControllerBase
有两种方式都可以进行路由映射。
2.1在方法上使用Route属性
路由名称和参数都写到Route属性里,每个方法都需要添加属性。
using Microsoft.AspNetCore.Mvc;
namespace _02WebApiController.Controllers
{
[ApiController]
public class ShirtsController : ControllerBase
{
[HttpGet]
[Route("/shirts")]
public string GetShirts()
{
return "Reading all the shirts";
}
[HttpGet]
[Route("/shirts/{id}")]
public string GetShirtsById(int id)
{
return $"Reading shirt with ID:{id}";
}
[HttpPost]
[Route("/shirts")]
public string CreateShirt()
{
return "Creating a shirt";
}
[HttpPut]
[Route("/shirts/{id}")]
public string UpdateShirt(int id)
{
return $"Updating shirt with ID:{id}";
}
[HttpDelete]
[Route("/shirts/{id}")]
public string DeleteShirt(int id)
{
return $"Deleting shirt with ID:{id}";
}
}
}
2.2在类名上使用Route属性
路由名称都在类的Route属性统一指定([controller]指控制器名称),参数写到请求方法属性里。
using Microsoft.AspNetCore.Mvc;
namespace _02WebApiController.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class NewShirtsController : ControllerBase
{
[HttpGet]
public string GetShirts()
{
return "Reading all the shirts1";
}
[HttpGet("{id}")]
public string GetShirtsById(int id)
{
return $"Reading shirt with ID:{id}";
}
[HttpPost]
public string CreateShirt()
{
return "Creating a shirt";
}
[HttpPut("{id}")]
public string UpdateShirt(int id)
{
return $"Updating shirt with ID:{id}";
}
[HttpDelete("{id}")]
public string DeleteShirt(int id)
{
return $"Deleting shirt with ID:{id}";
}
}
}