从MVC到Minimal APIs:基于ASP.NET Core 6.0的实现 - Ben Foster

作者:API传播员 · 2025-11-03 · 阅读时间:5分钟

从2007年ASP.NET MVC的引入,到2012年ASP.NET Web API的推出,再到如今的ASP.NET Core 6.0,微软的Web开发框架经历了显著的演变。这些框架从最初的模型-视图-控制器(MVC)模式,到支持构建轻量级HTTP API的Minimal APIs,体现了对开发者需求的不断适应和优化。本文将详细探讨从MVC到Minimal APIs的转变,并通过ASP.NET Core 6.0的示例,帮助开发者更好地理解如何利用Minimal APIs构建现代化的HTTP服务。


自举与框架初始化

MVC的初始化方式

在传统的ASP.NET Core MVC中,应用程序的初始化通常通过Startup类完成。然而,ASP.NET Core 6.0引入了顶级语句的支持,简化了初始化过程。现在,所有的引导代码都集中在一个Program.cs文件中:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

上述代码中,AddControllers()方法用于注册MVC框架的依赖项,而MapControllers()则负责注册控制器的路由和中间件。

Minimal APIs的初始化方式

Minimal APIs通过更简洁的方式实现了类似的功能。以下是一个典型的Minimal APIs初始化示例:

var app = WebApplication.CreateBuilder(args).Build();
app.MapGet("/", () => "Hello World!");
app.Run();

可以看到,Minimal APIs的初始化代码更加简洁,适合构建轻量级的HTTP服务。


路由定义与处理程序

MVC中的路由定义

在MVC中,路由可以通过两种方式定义:基于约定的路由和基于属性的路由。

  1. 基于约定的路由:通常用于网站开发,路由规则在Program.cs中定义,例如:

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
       endpoints.MapControllerRoute(
           name: "default",
           pattern: "{controller=Home}/{action=Index}/{id?}");
    });
  2. 基于属性的路由:更适合API开发,通过在控制器或操作方法上添加路由属性实现,例如:

    [Route("api/[controller]")]
    [ApiController]
    public class WeatherForecastController : ControllerBase
    {
       [HttpGet]
       public IEnumerable Get() { ... }
    }

Minimal APIs中的路由定义

Minimal APIs通过MapGetMapPost等方法定义路由。例如:

app.MapGet("/weatherforecast", () => new[] { "Sunny", "Rainy" });

此外,Minimal APIs还支持通过MapMethods定义自定义HTTP动词的路由。


模型绑定

模型绑定是从HTTP请求中提取数据并将其转换为.NET类型的过程。

MVC中的模型绑定

在MVC中,可以通过以下方式实现模型绑定:

  1. 从请求体绑定JSON数据

    [HttpPost]
    public IActionResult Create([FromBody] WeatherForecast forecast) { ... }
  2. 从查询字符串绑定复杂类型

    [HttpGet]
    public IActionResult Search([FromQuery] SearchParameters parameters) { ... }
  3. 绑定简单类型:简单类型会自动从路由或查询字符串中绑定。

Minimal APIs中的模型绑定

Minimal APIs的模型绑定与MVC类似,但更为简洁。例如:

app.MapPost("/create", (WeatherForecast forecast) => { ... });

需要注意的是,Minimal APIs目前不支持通过[FromQuery]绑定复杂类型。


HTTP响应

无论是MVC还是Minimal APIs,都支持将返回类型自动序列化为HTTP响应。

MVC中的HTTP响应

在MVC中,可以通过返回IActionResult来生成响应,例如:

public IActionResult Get()
{
    return Ok(new { Message = "Success" });
}

Minimal APIs中的HTTP响应

Minimal APIs通过IResult实现类似功能。例如:

app.MapGet("/success", () => Results.Ok(new { Message = "Success" }));

依赖注入

依赖注入(DI)是ASP.NET Core的重要特性,MVC和Minimal APIs均支持DI。

MVC中的依赖注入

在MVC中,依赖项通常通过构造函数注入:

public class WeatherForecastController : ControllerBase
{
    private readonly IWeatherService _service;

    public WeatherForecastController(IWeatherService service)
    {
        _service = service;
    }
}

Minimal APIs中的依赖注入

Minimal APIs则通过将依赖项作为参数传递给处理程序实现:

app.MapGet("/forecast", (IWeatherService service) => service.GetForecast());

授权与安全

ASP.NET Core的授权机制同样适用于MVC和Minimal APIs。

MVC中的授权

在MVC中,可以通过[Authorize]属性声明授权需求,例如:

[Authorize(Roles = "Admin")]
public IActionResult AdminOnly() { ... }

Minimal APIs中的授权

Minimal APIs通过在路由定义中附加元数据实现授权,例如:

app.MapGet("/admin", [Authorize] () => "Admin Area");

总结

Minimal APIs为开发者提供了一种轻量级的替代方案,适用于构建简单、高效的HTTP服务。与MVC相比,Minimal APIs的主要优势在于其简洁性和灵活性,开发者可以根据需求选择所需的功能组件,而无需引入不必要的复杂性。在实际开发中,可以根据项目的规模和需求,灵活选择MVC或Minimal APIs作为技术栈的一部分。

原文链接: https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/