dotnet Minimal APIs實(shí)現(xiàn)動態(tài)注冊端點(diǎn)
dotnet Minimal APIs實(shí)現(xiàn)動態(tài)注冊端點(diǎn)
前言
之前使用.Net的Minimal Apis框架開發(fā)了SharpIcoWeb圖片轉(zhuǎn)ico項目,也是初次使用這個最小Api框架,使用下來的感受就是小項目用起來非常舒服,很輕量。
在之前的項目中,我都是手動去注冊端點(diǎn),比如我創(chuàng)建了一個端點(diǎn)類IcoEndpoints
public static class IcoEndpoints
{
public static void MapIcoEndpoints(this WebApplication app)
{
var group = app.MapGroup("/api");
group.MapGet(...)
}
}
然后我會在Program.cs中注冊這個端點(diǎn)類
app.MapIcoEndpoints();
那么如果不想每個端點(diǎn)類都通過手動去注冊,就可以使用動態(tài)注冊的方法,動態(tài)注冊的原理是通過反射和擴(kuò)展方法來完成注冊。
動態(tài)注冊
本文就是使用基于接口的自動注冊,還可以根據(jù)約定端點(diǎn)類命名、特性、標(biāo)記去實(shí)現(xiàn)注冊。
文件層級結(jié)構(gòu)如下:
SharpIcoWeb
├── Endpoints
│ ├── Internal
│ │ ├── EndpointExtensions.cs
│ │ ├── IEndpoint.cs
│ ├── IcoEndpoints.cs
│ ├── testEndpoints.cs
├── Program.cs
接口類
首先目錄創(chuàng)建完成后,去創(chuàng)建IEndpoint接口類,讓每個端點(diǎn)類就去實(shí)現(xiàn)這個接口。
注意:static abstract接口成員需要C# 11+ (.NET 7+) 支持
public interface IEndpoint
{
static abstract void MapEndpoints(IEndpointRouteBuilder app);
}
端點(diǎn)類
測試端點(diǎn)類
public class TestEndpoints : IEndpoint
{
public static void MapEndpoints(IEndpointRouteBuilder app)
{
app.MapGet("/test", async (context) =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
}
圖片轉(zhuǎn)Ico端點(diǎn)類
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();
}
}
擴(kuò)展方法
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();
完成上述配置就可以實(shí)現(xiàn)自動注冊端點(diǎn)類了。
測試訪問
@SharpIcoWeb_HostAddress = http://localhost:5235
### 上傳文件并轉(zhuǎn)換為ICO(帶尺寸參數(shù))
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
### 測試端點(diǎn)類訪問
GET {{SharpIcoWeb_HostAddress}}/test

可以看到新建的test接口也是可以正常訪問的。
總結(jié)
實(shí)現(xiàn)端點(diǎn)類的自動注冊需要使用反射和擴(kuò)展方法來完成。
static abstract接口成員需要C# 11+ (.NET 7+) 支持
可以思考一下如何將服務(wù)和端點(diǎn)一起注冊
builder.Services.AddScoped<IFileService, FileService>();

浙公網(wǎng)安備 33010602011771號