You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET 7 Minimal API中使用MapGroup实现无控制器逻辑分组

在.NET 7 Minimal API中对端点逻辑分组的实用方案

1. 用扩展方法封装业务域端点

把同一业务模块的端点注册逻辑封装到静态扩展方法中,让Program.cs只负责调用这些扩展方法,保持主入口文件简洁。

示例代码:

// ProductsEndpointExtensions.cs
public static class ProductsEndpointExtensions
{
    public static IEndpointRouteBuilder MapProductEndpoints(this IEndpointRouteBuilder app)
    {
        var productGroup = app.MapGroup("/api/products");
        
        productGroup.MapGet("/", () => Results.Ok(ProductService.GetAll()))
                    .WithName("GetAllProducts")
                    .WithOpenApi();
        
        productGroup.MapGet("/{id:int}", (int id) => 
        {
            var product = ProductService.GetById(id);
            return product is not null ? Results.Ok(product) : Results.NotFound();
        })
                    .WithName("GetProductById")
                    .WithOpenApi();
        
        productGroup.MapPost("/", (Product product) => 
        {
            ProductService.Create(product);
            return Results.Created($"/api/products/{product.Id}", product);
        })
                    .WithName("CreateProduct")
                    .WithOpenApi();
        
        return app;
    }
}

// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapProductEndpoints(); // 注册产品模块端点
app.MapOrderEndpoints();   // 注册订单模块端点

app.Run();

2. 借助MapGroup实现路由与中间件隔离

通过MapGroup可以给同一模块的端点统一添加路由前缀,还能为整个分组绑定专属中间件(比如授权、日志),实现业务域的逻辑隔离。

示例:

var adminGroup = app.MapGroup("/api/admin")
                    .RequireAuthorization("AdminPolicy"); // 该分组下所有端点需管理员权限

adminGroup.MapGet("/users", () => Results.Ok(UserService.GetAllAdmins()));
adminGroup.MapPost("/users", (AdminUser user) => 
{
    UserService.CreateAdmin(user);
    return Results.Created();
});

3. 按业务模块拆分文件

将每个业务域的端点定义放在独立文件中,甚至可以拆分到单独的类库项目里。比如创建Products/ProductsEndpoints.cs、Orders/OrdersEndpoints.cs这样的结构,每个文件只负责对应模块的端点注册,让项目结构更清晰。

4. 用端点过滤器复用公共逻辑

如果多个端点有重复逻辑(比如参数校验、异常捕获),可以自定义端点过滤器,给整个分组绑定过滤器,避免代码重复。

示例:

public class ValidationFilter<T> : IEndpointFilter
{
    public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
    {
        var model = context.Arguments.OfType<T>().FirstOrDefault();
        if (model is null || !context.ModelState.IsValid)
        {
            return Results.ValidationProblem(context.ModelState);
        }
        return await next(context);
    }
}

// 在产品分组中绑定校验过滤器
var productGroup = app.MapGroup("/api/products")
                     .AddEndpointFilter<ValidationFilter<Product>>();

以上方案都无需依赖控制器,就能在中大型应用中对Minimal API的逻辑进行模块化分组,保证代码的可维护性与扩展性。

内容的提问来源于stack exchange,提问作者esamaldin elzain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:31:00