赘暨逢 发表于 2025-7-15 16:02:16

dotnet Minimal APIs实现动态注册端点

dotnet Minimal APIs实现动态注册端点

前言

之前使用.Net的Minimal Apis框架开发了SharpIcoWeb图片转ico项目,也是初次使用这个最小Api框架,使用下来的感受就是小项目用起来非常舒服,很轻量。
在之前的项目中,我都是手动去注册端点,比如我创建了一个端点类IcoEndpoints
public static class IcoEndpoints
{
    public static void MapIcoEndpoints(this WebApplication app)
    {
      var group = app.MapGroup("/api");
      group.MapGet(...)
    }
}然后我会在Program.cs中注册这个端点类
app.MapIcoEndpoints();那么如果不想每个端点类都通过手动去注册,就可以使用动态注册的方法,动态注册的原理是通过反射和扩展方法来完成注册。
动态注册

本文就是使用基于接口的自动注册,还可以根据约定端点类命名、特性、标记去实现注册。
文件层级结构如下:
SharpIcoWeb
├── Endpoints
│   ├── Internal
│   │   ├── EndpointExtensions.cs
│   │   ├── IEndpoint.cs
│   ├── IcoEndpoints.cs
│   ├── testEndpoints.cs
├── Program.cs接口类

首先目录创建完成后,去创建IEndpoint接口类,让每个端点类就去实现这个接口。
注意:static abstract接口成员需要C# 11+ (.NET 7+) 支持
public interface IEndpoint
{
    static abstract void MapEndpoints(IEndpointRouteBuilder app);
}端点类

测试端点类
public class TestEndpoints : IEndpoint
{
    public static void MapEndpoints(IEndpointRouteBuilder app)
    {
      app.MapGet("/test", async (context) =>
      {
            await context.Response.WriteAsync("Hello, World!");
      });
    }
}图片转Ico端点类
public class IcoEndpoints: IEndpoint
{
    public static void MapEndpoints(IEndpointRouteBuilder app)
    {
      var group = app.MapGroup("/api");

      // 上传图片文件并返回文件名
      group.MapPost("/uploadDownload", UploadDownload)
            .DisableAntiforgery();

      // 获取图片信息
      group.MapGet("/getImageInfo/{filename}", GetImageInfo);

      // 下载文件
      group.MapGet("/downloads/{fileName}", DowloadFile);

      // 上传图片文件并返回文件名和不同尺寸的ICO文件的ZIP文件
      group.MapPost("/uploadDownload/sizes", UploadDownloadSizes)
            .DisableAntiforgery();
    }
}扩展方法

public static class EndpointExtensions
{
    public static void MapAllEndpoints(this IEndpointRouteBuilder app)
    {
      var endpointTypes = Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(t => typeof(IEndpoint).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);

      foreach (var type in endpointTypes)
      {
            type.GetMethod(nameof(IEndpoint.MapEndpoints))?
            .Invoke(null, new object[] { app });
      }
    }
}Program.cs

app.MapAllEndpoints();完成上述配置就可以实现自动注册端点类了。
测试访问

@SharpIcoWeb_HostAddress = http://localhost:5235

### 上传文件并转换为ICO(带尺寸参数)
POST {{SharpIcoWeb_HostAddress}}/api/uploadDownload/sizes
Content-Type: multipart/form-data; boundary=WebAppBoundary

--WebAppBoundary
Content-Disposition: form-data; name="file"; filename="1.png"
Content-Type: image/png

< ./1.png
--WebAppBoundary
Content-Disposition: form-data; name="sizes"

16,32,48,64,128

### 测试端点类访问
GET {{SharpIcoWeb_HostAddress}}/test
可以看到新建的test接口也是可以正常访问的。
总结

实现端点类的自动注册需要使用反射和扩展方法来完成。
static abstract接口成员需要C# 11+ (.NET 7+) 支持
可以思考一下如何将服务和端点一起注册
builder.Services.AddScoped<IFileService, FileService>();
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

准挝 发表于 2025-10-25 10:45:23

热心回复!

邰怀卉 发表于 2025-11-10 01:43:03

感谢发布原创作品,程序园因你更精彩

艾曼语 发表于 2025-11-18 04:10:06

感谢分享,学习下。

上官泰 发表于 2025-12-15 19:28:28

不错,里面软件多更新就更好了

第璋胁 发表于 2025-12-16 07:19:28

谢谢楼主提供!

撷监芝 发表于 2025-12-23 16:48:07

感谢分享

扒钒 发表于 2026-1-15 07:49:26

感谢分享,下载保存了,貌似很强大

供挂 发表于 2026-1-18 16:02:40

分享、互助 让互联网精神温暖你我

但婆 发表于 2026-1-18 16:14:48

感谢分享,下载保存了,貌似很强大

蝌棚煌 发表于 2026-1-20 00:01:37

前排留名,哈哈哈

炳裘垦 发表于 2026-1-20 18:56:00

喜欢鼓捣这些软件,现在用得少,谢谢分享!

黎瑞芝 发表于 2026-1-21 00:45:57

谢谢楼主提供!

啖曼烟 发表于 2026-1-21 14:43:35

感谢发布原创作品,程序园因你更精彩

锟及 发表于 2026-1-22 11:34:37

新版吗?好像是停更了吧。

毁抨句 发表于 2026-1-25 11:12:37

这个好,看起来很实用

怀陶宁 发表于 2026-1-27 02:51:53

热心回复!

喳谍 发表于 2026-1-28 09:15:52

谢谢楼主提供!

莠畅缕 发表于 2026-1-29 02:22:52

收藏一下   不知道什么时候能用到

慕疼 发表于 2026-2-3 08:17:13

这个有用。
页: [1] 2 3
查看完整版本: dotnet Minimal APIs实现动态注册端点