从控制器迁移到Minimal API | 作者:Christian Brevik - Variant

作者:API传播员 · 2025-10-29 · 阅读时间:4分钟
本文指导从MVC控制器迁移到ASP.NET Core Minimal API,通过扩展方法、分离处理逻辑和路由组实现代码简洁与维护性,适用于小型到大型API项目。

从控制器迁移到 Minimal API 的探索

如果你已经习惯了使用 MVC 控制器,并且想了解如何在 ASP.NET Core 中以一种简洁且高效的方式使用 Minimal API,那么这篇文章将为你提供一些有用的指导。


Minimal API 的基本示例

当你第一次接触 Minimal API 时,可能会看到类似以下的代码示例:

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

与传统的 MVC 控制器相比,这种方式显得非常简单直接。然而,如果你将所有路由(如 app.MapGetapp.MapPost)都放在 Program.cs 文件中,并直接在其中编写逻辑,随着项目的复杂度增加,代码将变得难以维护。


Minimal API 与控制器的对比

在使用控制器时,你通常会为每个路由前缀创建一个控制器类,并在其中定义多个操作方法。这种方式提供了明确的关注点分离,并且代码组织也更加清晰。

Minimal API 则没有控制器类作为端点的容器。以下是一个 Minimal API 的示例:

// Program.cs
app.MapGet("/hello", (IHelloService helloService) => helloService.FetchHello());

虽然这种方式简洁,但如果你希望将逻辑从路由中分离出来,可以通过扩展方法来实现。


使用扩展方法优化路由

为了保持 Program.cs 文件的整洁,可以将路由逻辑封装到扩展方法中:

public static class HelloEndpoints
{
    public static void MapHelloEndpoints(this WebApplication app)
    {
        app.MapGet("/hello", (IHelloService helloService) => helloService.FetchHello());
    }
}

然后在 Program.cs 中调用:

app.MapHelloEndpoints();

虽然这种方式将路由逻辑移到了单独的文件中,但当端点数量增加时,代码仍然可能变得难以管理。


更进一步的优化:分离处理逻辑

为了进一步优化代码,可以将每个端点的处理逻辑封装到独立的类中。例如:

public class GetHello
{
    public static GetHelloResponse Handle(IHelloService helloService)
    {
        return helloService.FetchHello();
    }
}

然后在扩展方法中引用这些处理类:

public static class HelloEndpoints
{
    public static void MapHelloEndpoints(this WebApplication app)
    {
        app.MapGet("/hello", GetHello.Handle);
    }
}

这种方式不仅清晰地分离了路由和逻辑,还使得每个类专注于实现特定的业务功能。


使用路由组实现更高级的功能

Minimal API 提供了路由组(Route Group)的功能,可以为一组路由添加通用的配置。例如:

var group = app.MapGroup("/hello")
    .RequireAuthorization()
    .WithOpenApi();

group.MapGet("/", GetHello.Handle);

通过这种方式,可以为同一组路由统一添加授权、OpenAPI 文档等配置。

如果需要为多个组应用相同的行为,可以创建扩展方法:

public static class RouteGroupBuilderExtensions
{
    public static RouteGroupBuilder MapAdminGroup(
        this IEndpointRouteBuilder builder,
        string prefix,
        string groupName)
    {
        return builder.MapGroup($"admin/{prefix}")
            .WithOpenApi()
            .WithTags(groupName)
            .RequireAuthorization("admin");
    }
}

Program.cs 中使用:

app.MapAdminGroup("hello", "Hello")
   .MapHelloEndpoints();

文件组织建议

为了更好地管理代码,可以按照以下结构组织文件:

  • 每个路由组对应一个文件夹,例如 HelloEndpoints
  • 每个端点的处理逻辑放在独立的类中,例如 GetHelloPostHello
  • 嵌套路由可以放在子文件夹中,例如 HelloGoodbyeEndpoints

这种结构不仅清晰,还便于快速导航和维护。


总结

通过本文描述的模式,你可以在 Minimal API 中实现类似 MVC 控制器的关注点分离,同时保持代码的简洁和灵活性。无论是小型原型还是大型生产级 API,这种模式都能很好地适应。

希望这篇文章对你有所帮助,祝你在构建 Minimal API 时一切顺利!😊


原文链接

从控制器迁移到 Minimal API | 作者:Christian Brevik – Variant

原文链接: https://blog.variant.no/moving-from-controllers-to-minimal-api-bda56a223cc8