在.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
相关产品推荐
相关产品推荐

