.NET 6 Minimal API 如何将端点拆分到多个文件而非全部放在Program中
.NET 6 Minimal API 端点拆分独立文件的可行方案
方案1:基于IEndpointRouteBuilder扩展方法手动注册(最常用,轻量)
这是最易上手的实现方式,通过为IEndpointRouteBuilder编写静态扩展方法,把不同业务的端点定义分散到对应独立文件中,在Program.cs统一调用即可。
代码实现
- 新建
ProductEndpoints.cs,编写产品相关端点逻辑:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; namespace 你的项目命名空间; public static class ProductEndpoints { public static void MapProductEndpoints(this IEndpointRouteBuilder app) { // 可通过MapGroup统一设置路由前缀、认证规则、Swagger标签,减少重复代码 var productGroup = app.MapGroup("/products") .WithTags("产品接口") .RequireAuthorization(); // 整个产品模块都需要鉴权 // 产品相关端点 productGroup.MapGet("/{id}", (int id) => { return Results.Ok(new { Id = id, Name = "示例产品" }); }); productGroup.MapPost("/", () => { return Results.Created(); }); } }
- 新建
UserEndpoints.cs,编写用户相关端点逻辑:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; namespace 你的项目命名空间; public static class UserEndpoints { public static void MapUserEndpoints(this IEndpointRouteBuilder app) { var userGroup = app.MapGroup("/users") .WithTags("用户接口"); userGroup.MapGet("/{id}", (int id) => { return Results.Ok(new { Id = id, UserName = "示例用户" }); }); } }
- Program.cs中调用注册方法即可:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 按需注册各个业务模块的端点 app.MapProductEndpoints(); app.MapUserEndpoints(); app.Run();
方案2:自动扫描注册(适合中大型多模块项目)
如果项目业务模块多,不想每次新增模块都修改Program.cs,可以通过接口标记+反射扫描的方式实现自动注册。
代码实现
- 先定义模块标记接口:
namespace 你的项目命名空间; public interface IEndpointModule { void RegisterEndpoints(IEndpointRouteBuilder app); }
- 各个业务端点类实现该接口,以
ProductEndpoints.cs为例:
namespace 你的项目命名空间; public class ProductEndpoints : IEndpointModule { public void RegisterEndpoints(IEndpointRouteBuilder app) { var productGroup = app.MapGroup("/products"); productGroup.MapGet("/{id}", (int id) => Results.Ok()); } }
- 编写自动扫描扩展方法:
using System.Reflection; using Microsoft.AspNetCore.Routing; namespace 你的项目命名空间; public static class EndpointModuleExtensions { public static void MapAllEndpointModules(this IEndpointRouteBuilder app) { // 扫描当前程序集所有实现了IEndpointModule的类,自动注册 var endpointModules = Assembly.GetExecutingAssembly() .GetTypes() .Where(t => typeof(IEndpointModule).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract) .Select(Activator.CreateInstance) .Cast<IEndpointModule>(); foreach (var module in endpointModules) { module.RegisterEndpoints(app); } } }
- Program.cs中一行代码完成所有模块注册:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapAllEndpointModules(); app.Run();
选型建议
- 手动注册:适合小型项目,模块数量≤10个,逻辑直观无额外开销,可灵活控制端点注册顺序
- 自动注册:适合中大型项目,业务模块多、迭代频繁,新增模块无需修改Program.cs,降低代码耦合
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

