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

如何在ASP.NET Core启动时以编程方式注册可自定义端点?

实现方案

核心思路是剥离端点逻辑与注册流程,让包使用者完全掌控是否注册、自定义路由甚至替换业务逻辑,避免控制器自动发现带来的限制。

1. 抽取核心业务逻辑到独立服务

先把原MyEndpointFunction中的业务逻辑抽成可替换的服务,确保逻辑复用性与可扩展性:

// 定义接口,允许使用者替换实现
public interface IMyEndpointHandler
{
    IResult HandleRequest(); // 用IResult替代JsonResult更符合ASP.NET Core规范
}

// 默认实现,包含原有的业务逻辑
public class DefaultMyEndpointHandler : IMyEndpointHandler
{
    public IResult HandleRequest()
    {
        // 这里写入原MyEndpointFunction中的业务逻辑
        return Results.Json(new { Status = "Success", Message = "Default response" });
    }
}

2. 编写扩展方法让使用者控制端点注册

提供WebApplication的扩展方法(端点注册需在应用构建完成后执行),让使用者自主决定是否注册、指定路由:

public static class MyEndpointExtensions
{
    /// <summary>
    /// 注册自定义端点,使用者可指定路由,或不调用此方法跳过注册
    /// </summary>
    /// <param name="app">WebApplication实例</param>
    /// <param name="route">自定义路由,默认值为/SomeRoute</param>
    /// <returns></returns>
    public static WebApplication MapMyCustomEndpoint(this WebApplication app, string route = "/SomeRoute")
    {
        // 注册默认处理器(若使用者未自行注册则生效)
        app.Services.TryAddSingleton<IMyEndpointHandler, DefaultMyEndpointHandler>();
        
        var handler = app.Services.GetRequiredService<IMyEndpointHandler>();
        
        // 注册GET和POST请求的端点
        app.MapGet(route, () => handler.HandleRequest())
           .WithName("MyCustomEndpoint_Get");
        
        app.MapPost(route, () => handler.HandleRequest())
           .WithName("MyCustomEndpoint_Post");
        
        return app;
    }
}

3. 使用者的使用方式

场景1:使用默认路由注册端点

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

// 调用扩展方法注册默认路由的端点
app.MapMyCustomEndpoint();

app.Run();

场景2:自定义路由注册端点

var app = builder.Build();

// 指定自定义路由
app.MapMyCustomEndpoint("/MyCustomRoute");

app.Run();

场景3:替换业务逻辑实现

var builder = WebApplication.CreateBuilder(args);

// 注册自定义处理器,覆盖默认实现
builder.Services.AddSingleton<IMyEndpointHandler, CustomMyEndpointHandler>();

var app = builder.Build();
app.MapMyCustomEndpoint();

app.Run();

// 自定义处理器示例
public class CustomMyEndpointHandler : IMyEndpointHandler
{
    public IResult HandleRequest()
    {
        return Results.Json(new { Status = "Success", Message = "Custom response" });
    }
}

场景4:不注册该端点

直接不调用MapMyCustomEndpoint方法即可,该端点完全不会在应用中注册。

方案优势

  • 彻底规避控制器自动发现的问题:端点注册完全由使用者主动触发,无隐形注册逻辑。
  • 满足所有核心需求:支持自定义路由、跳过注册、替换业务逻辑。
  • 符合ASP.NET Core最佳实践:用最小API注册端点轻量可控,依赖注入实现逻辑解耦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:25:02