Minimal APIs with Carter

Carter 是一个用于 ASP.NET Core 的轻量级框架,旨在简化构建 Minimal API 的过程。如果你觉得 Minimal API 虽然简洁,但在组织大量端点时显得有些杂乱,或者希望更方便地集成验证、文件处理等功能,Carter 是一个非常值得尝试的优雅解决方案。它提供了一种简洁的方式来定义路由、处理请求和响应,同时保持代码的可读性和可维护性。

以下是使用 Carter 创建最小化 API 的基本步骤:

  1. 安装 Carter 包
    首先,您需要在您的 ASP.NET Core 项目中安装 Carter NuGet 包。您可以使用以下命令:

    1
    dotnet add package Carter
  2. 创建 Carter 模块
    创建一个新的类,继承自 CarterModule,并在构造函数中定义路由和处理程序。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using Carter;

    public class HomeModule : CarterModule
    {
    public override void AddRoutes(IEndpointRouteBuilder app)
    {
    app.MapGet("/hello", () => "Hello, World!");

    app.MapPost("/echo", async (HttpRequest request) =>
    {
    using var reader = new StreamReader(request.Body);
    var body = await reader.ReadToEndAsync();
    return Results.Ok(body);
    });
    }
    }
  3. 配置 Carter 中间件
    Startup.csProgram.cs 文件中,添加 Carter 中间件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using Carter;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.Extensions.DependencyInjection;

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddCarter();

    var app = builder.Build();
    app.MapCarter();
    app.Run();

    完整的 Demo 项目可以参考这里 OddsAndEnds/CarterWebApi

Carter vs. 传统Controller

使用 Carter 构建 Minimal API 相较于传统的 Controller 方法有几个优势:

  • 简洁性:Carter 允许您直接在模块中定义路由和处理程序,减少了样板代码。
  • 模块化:通过将相关端点组织在同一个模块中,代码更易于维护和理解。
  • 内置功能:Carter 提供了许多内置功能,如验证、文件处理等,简化了常见任务的实现。

📊 性能对比

维度Carter (Minimal API风格)传统 Controller
启动性能更优:无MVC框架开销,更少中间件有MVC框架初始化开销
内存占用更低:更少中间件和内置对象包含ViewResult、ActionContext等额外对象
请求处理开销更低:直接处理请求,无MVC管道需经过模型绑定、过滤器、ActionInvoker等步骤
反射使用更少:依赖方法组和委托大量使用反射(方法选择、参数绑定)
基准测试结果吞吐量通常高10-20%略低于Minimal API风格

📈 实际性能数据参考

根据ASP.NET团队基准测试:

  • 简单API端点:Carter/Minimal API吞吐量高15-25%
  • JSON序列化:基本相同(都使用System.Text.Json)
  • 内存分配:Carter减少20-30%的分配
  • 启动时间:Carter应用启动快10-15%

总结

通过使用 Carter,您可以轻松地创建和管理最小化 API,同时保持代码的简洁和可维护性。Carter 还支持中间件、依赖注入和其他 ASP.NET Core 功能,使其成为构建现代 Web 应用程序的强大工具。Carter在性能和代码组织结构上有明显优势,特别适合API优先的微服务架构。传统Controller在功能完整性和生态系统上仍有优势,适合全栈Web应用。选择时需权衡项目需求、团队技能和长期维护成本。

参考资料