找回密码
 立即注册
首页 业界区 安全 dotnet Minimal APIs实现动态注册端点

dotnet Minimal APIs实现动态注册端点

赘暨逢 昨天 16:02
dotnet Minimal APIs实现动态注册端点

前言

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

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

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

测试端点类
  1. public class TestEndpoints : IEndpoint
  2. {
  3.     public static void MapEndpoints(IEndpointRouteBuilder app)
  4.     {
  5.         app.MapGet("/test", async (context) =>
  6.         {
  7.             await context.Response.WriteAsync("Hello, World!");
  8.         });
  9.     }
  10. }
复制代码
图片转Ico端点类
  1. public class IcoEndpoints: IEndpoint
  2. {
  3.     public static void MapEndpoints(IEndpointRouteBuilder app)
  4.     {
  5.         var group = app.MapGroup("/api");
  6.         // 上传图片文件并返回文件名
  7.         group.MapPost("/uploadDownload", UploadDownload)
  8.             .DisableAntiforgery();
  9.         // 获取图片信息
  10.         group.MapGet("/getImageInfo/{filename}", GetImageInfo);
  11.         // 下载文件
  12.         group.MapGet("/downloads/{fileName}", DowloadFile);
  13.         // 上传图片文件并返回文件名和不同尺寸的ICO文件的ZIP文件
  14.         group.MapPost("/uploadDownload/sizes", UploadDownloadSizes)
  15.             .DisableAntiforgery();
  16.     }
  17. }
复制代码
扩展方法
  1. public static class EndpointExtensions
  2. {
  3.     public static void MapAllEndpoints(this IEndpointRouteBuilder app)
  4.     {
  5.         var endpointTypes = Assembly.GetExecutingAssembly()
  6.             .GetTypes()
  7.             .Where(t => typeof(IEndpoint).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
  8.         foreach (var type in endpointTypes)
  9.         {
  10.             type.GetMethod(nameof(IEndpoint.MapEndpoints))?
  11.             .Invoke(null, new object[] { app });
  12.         }
  13.     }
  14. }
复制代码
Program.cs
  1. app.MapAllEndpoints();
复制代码
完成上述配置就可以实现自动注册端点类了。
测试访问
  1. @SharpIcoWeb_HostAddress = http://localhost:5235
  2. ### 上传文件并转换为ICO(带尺寸参数)
  3. POST {{SharpIcoWeb_HostAddress}}/api/uploadDownload/sizes
  4. Content-Type: multipart/form-data; boundary=WebAppBoundary
  5. --WebAppBoundary
  6. Content-Disposition: form-data; name="file"; filename="1.png"
  7. Content-Type: image/png
  8. < ./1.png
  9. --WebAppBoundary
  10. Content-Disposition: form-data; name="sizes"
  11. 16,32,48,64,128
  12. ### 测试端点类访问
  13. GET {{SharpIcoWeb_HostAddress}}/test
复制代码
1.png

可以看到新建的test接口也是可以正常访问的。
总结

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