在ASP.NET Core中自动注册Minimal APIs

作者:API传播员 · 2025-11-03 · 阅读时间:4分钟
在ASP.NET Core中,通过自动注册Minimal APIs可以显著简化代码管理,提高可维护性和开发效率。文章详细介绍了使用IEndpoint抽象和反射技术实现自动注册的步骤,包括创建接口、扫描程序集和集成到Program文件,同时讨论了性能优化和源代码生成器的应用。

在ASP.NET Core中自动注册Minimal APIs

在ASP.NET Core中,Minimal 端点进行分组,从而保持代码的清晰性和可维护性。

Minimal API 的组件化设计

将每个 Minimal API 端点视为独立的组件是一个良好的实践。这种方法与垂直切片的概念非常契合,有助于将不同功能模块的逻辑隔离开来。通过这种方式,我们可以更轻松地扩展项目,同时保持代码的整洁。

接下来,我们将展示如何通过简单的抽象实现 Minimal API 的自动注册。


自动注册 Minimal APIs 的优势

通过自动注册 Minimal APIs,我们可以显著减少样板代码,简化开发流程。其核心思想是建立一个集中式的注册机制,使代码库更加简洁,同时提升项目的可维护性。

以下是实现自动注册的步骤:


创建 IEndpoint 抽象

首先,我们需要创建一个简单的 IEndpoint 抽象来表示单个端点。每个 IEndpoint 实现应该只包含一个 Minimal API 端点定义。例如:

public interface IEndpoint
{
    void MapEndpoint(IEndpointRouteBuilder builder);
}

MapEndpoint 方法接受一个 IEndpointRouteBuilder 参数,用于调用 MapGetMapPost 等方法来定义具体的 API 端点。

注意:虽然可以在 MapEndpoint 方法中注册多个端点,但为了保持代码的单一职责原则,建议每个 IEndpoint 实现只定义一个端点。


使用反射扫描并注册端点

为了实现自动注册,我们可以利用反射在运行时动态扫描程序集,查找所有实现了 IEndpoint 接口的类,并将它们配置为依赖注入服务。以下是实现的关键步骤:

  1. 扫描程序集

    使用反射扫描指定的 .NET 程序集,查找实现了 IEndpoint 接口的类。

  2. 注册服务

    将这些类注册为依赖注入服务,以便后续在应用启动时使用。

以下是实现代码的示例:

public static void AddEndpoints(this IServiceCollection services, Assembly assembly)
{
    var endpointTypes = assembly.GetTypes()
        .Where(type => typeof(IEndpoint).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract);

    foreach (var endpointType in endpointTypes)
    {
        services.AddSingleton(typeof(IEndpoint), endpointType);
    }
}

提示:如果需要在多个程序集(项目)中定义端点,可以扩展此方法以接受一个程序集集合。


自动注册端点

在完成服务注册后,我们需要在应用启动时自动注册所有端点。可以通过在 WebApplication 上创建一个扩展方法来实现:

public static void MapEndpoints(this WebApplication app)
{
    var endpoints = app.Services.GetServices();

    foreach (var endpoint in endpoints)
    {
        endpoint.MapEndpoint(app);
    }
}

此外,如果需要为所有端点应用统一的约定(如路由前缀、身份验证或 API 版本控制),可以传入一个 RouteGroupBuilder 参数。例如:

public static void MapEndpoints(this WebApplication app, Action configure)
{
    var endpoints = app.Services.GetServices();

    foreach (var endpoint in endpoints)
    {
        var group = app.MapGroup("");
        configure(group);
        endpoint.MapEndpoint(group);
    }
}

集成到 Program 文件

将上述方法集成到 Program 文件中非常简单。以下是一个完整的示例:

var builder = WebApplication.CreateBuilder(args);

// 注册端点
builder.Services.AddEndpoints(typeof(Program).Assembly);var app = builder.Build();// 自动注册端点
app.MapEndpoints(group =>
{
    group.WithTags("API")
         .RequireAuthorization()
         .AddEndpointFilter();
});app.Run();

在这个示例中,我们调用了 AddEndpoints 方法来注册所有 IEndpoint 实现,并通过 MapEndpoints 方法自动注册 Minimal API。


自动注册的性能考虑

虽然使用反射技术可以显著提高开发效率,但需要注意其对应用程序启动性能的潜在影响。为了解决这一问题,可以考虑使用源代码生成器来预编译注册逻辑,从而避免运行时的反射开销。


总结

通过自动注册 Minimal APIs,我们能够显著简化代码管理,提高项目的可维护性和开发效率。无论是通过反射还是源代码生成器,这种方法都为大型项目的 API 管理提供了强大的支持。

在实际应用中,可以根据项目需求选择合适的实现方式,同时注意性能优化和代码规范的维护。

原文链接: https://www.milanjovanovic.tech/blog/automatically-register-minimal-apis-in-aspnetcore