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

.NET 6 Minimal API 如何将端点拆分到多个文件而非全部放在Program中

.NET 6 Minimal API 端点拆分独立文件的可行方案

方案1:基于IEndpointRouteBuilder扩展方法手动注册(最常用,轻量)

这是最易上手的实现方式,通过为IEndpointRouteBuilder编写静态扩展方法,把不同业务的端点定义分散到对应独立文件中,在Program.cs统一调用即可。

代码实现

  1. 新建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();
        });
    }
}
  1. 新建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 = "示例用户" });
        });
    }
}
  1. Program.cs中调用注册方法即可:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// 按需注册各个业务模块的端点
app.MapProductEndpoints();
app.MapUserEndpoints();

app.Run();

方案2:自动扫描注册(适合中大型多模块项目)

如果项目业务模块多,不想每次新增模块都修改Program.cs,可以通过接口标记+反射扫描的方式实现自动注册。

代码实现

  1. 先定义模块标记接口:
namespace 你的项目命名空间;

public interface IEndpointModule
{
    void RegisterEndpoints(IEndpointRouteBuilder app);
}
  1. 各个业务端点类实现该接口,以ProductEndpoints.cs为例:
namespace 你的项目命名空间;

public class ProductEndpoints : IEndpointModule
{
    public void RegisterEndpoints(IEndpointRouteBuilder app)
    {
        var productGroup = app.MapGroup("/products");
        productGroup.MapGet("/{id}", (int id) => Results.Ok());
    }
}
  1. 编写自动扫描扩展方法:
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);
        }
    }
}
  1. Program.cs中一行代码完成所有模块注册:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapAllEndpointModules();

app.Run();

选型建议

  • 手动注册:适合小型项目,模块数量≤10个,逻辑直观无额外开销,可灵活控制端点注册顺序
  • 自动注册:适合中大型项目,业务模块多、迭代频繁,新增模块无需修改Program.cs,降低代码耦合

内容的提问来源于stack exchange,提问作者Miguel Moura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:06