組織端點的一種簡單方法是使用擴展方法。
我們可以在一個名為 Endpoints 的文件夾中,或者在一個特定的功能文件夾(如 TodoItems 文件夾)中創(chuàng)建一個名為 TodoItemEndpoints.cs 的文件,并在其中添加以下代碼:
public static class TodoItemEndpoints
{
public static void MapTodoItemEndpoints(this IEndpointRouteBuilder routes)
{
routes.MapGet("/todoitems", async (DbContext db) =>
{
return await db.TodoItems.ToListAsync();
});
}
}
通過這種方式,我們可以將端點的定義與主程序文件分離,從而使代碼更加模塊化和清晰。
為了讓代碼更清晰,我們可以使用 TypedResults 替代 Results。
當使用 Results 時,通常需要添加一個 Produces 屬性,以便為 Swagger 等工具指定有效的響應類型。而使用 TypedResults 后,可以直接從返回類型中推斷出響應類型,從而省略 Produces 屬性。這不僅減少了代碼的冗余,還能在編譯時檢查錯誤,使單元測試更加簡單。
例如:
return TypedResults.Ok(todoItem);
這種方法可以顯著提升代碼的可讀性和可靠性。
盡管我們已經將端點定義移到了單獨的文件中,但代碼可能仍然顯得混亂且難以測試。
為了解決這些問題,可以將 Lambda 表達式中的邏輯提取到獨立的方法中。例如:
public static class TodoItemEndpoints
{
public static void MapTodoItemEndpoints(this IEndpointRouteBuilder routes)
{
routes.MapGet("/todoitems", GetTodoItems);
}
private static async Task GetTodoItems(DbContext db)
{
var items = await db.TodoItems.ToListAsync();
return TypedResults.Ok(items);
}
}
通過這種方式,我們可以直接調用這些方法進行測試,而無需通過 API 調用來驗證邏輯。
為了進一步優(yōu)化代碼結構,可以對端點進行分組,避免重復定義。
例如,我們可以將所有與 TodoItems 相關的端點分組:
app.MapGroup("/todoitems")
.RequireAuthorization()
.WithTags("TodoItems")
.MapGet("/", GetTodoItems)
.MapPost("/", CreateTodoItem);
這種分組方式不僅減少了重復代碼,還允許我們對整個組應用屬性,例如授權、標簽、CORS 或速率限制等。當然,如果需要,也可以對單個端點應用這些屬性。
通過以上方法,我們可以顯著提升 ASP.NET Core Minimal APIs 的組織性和可維護性。使用擴展方法、TypedResults、功能分離以及端點分組,不僅讓代碼更清晰,還提高了測試和擴展的便利性。
Minimal APIs 是一個強大的工具,完全可以勝任“真實生產”環(huán)境中的應用開發(fā)。希望本文的內容能為您在實際項目中使用 Minimal APIs 提供一些有價值的參考。
原文鏈接: https://www.tessferrandez.com/blog/2023/10/31/organizing-minimal-apis.html