使用 ASP.NET Core 要求委派產生器將 Map 方法轉換成要求委派
ASP.NET Core 要求委派產生器 (RDG) 是一種編譯時間來源產生器,可編譯已提供給基本 API 的路由處理常式,以要求能夠由 ASP.NET Core 路由基礎結構處理的委派。 在已啟用 AoT 或已啟用修剪的情況下發佈應用程式時,RDG 會以隱含的方式啟用。 RDG 會產生修剪和原生 AoT 易記程式碼。
注意
- 原生 AOT 功能目前為預覽版。
- 在 .NET 8 中,並非所有 ASP.NET Core 功能都與原生 AOT 相容。
RDG:
- 是來源產生器。
- 將每個
Map
方法轉換成與特定路由相關聯的 RequestDelegate。Map
方法包含 EndpointRouteBuilderExtensions 中的方法,例如 MapGet、MapPost、MapPatch、MapPut 和 MapDelete。
在未啟用原生 AOT 的情況下發佈時:
- 與特定路由相關聯的
Map
方法會在應用程式啟動時 (而非在應用程式建置時) 於記憶體中編譯為要求委派。 - 要求委派會在執行階段產生。
在已啟用原生 AOT 的情況下發佈時:
- 與特定路由相關聯的
Map
方法會在應用程式建置時編譯。 RDG 會建立路由的要求委派,並將要求委派編譯成應用程式的原生映像。 - 不需要在執行階段產生要求委派。
- 請確定:
- 應用程式 API 中所使用的類型是透過可由原生 AOT 工具鏈以靜態方式分析的方式,根植於應用程式的程式碼中。
- 不需要修剪所需的程式碼。
RDG:
- 已啟用原生 AOT 的情況下發佈或啟用修剪時,會在專案中自動啟用。
- 即使未使用原生 AOT,仍可在專案檔中設定
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
,以手動方式啟用:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
</PropertyGroup>
</Project>
手動啟用 RDG 可用於:
- 評估專案與原生 AOT 的相容性。
- 藉由預先產生要求委派來減少應用程式的啟動時間。
基本 API 已針對使用 System.Text.Json 最佳化,需要使用 System.Text.Json 來源產生器。 所有在基本 API 中接受為要求委派或從要求委派傳回參數的類型,都必須在透過 ASP.NET Core 相依性插入註冊的 JsonSerializerContext 上進行設定:
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(
0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = new Todo[] {
new(1, "Walk the dog"),
new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
new(4, "Clean the bathroom"),
new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
不支援 RDG 案例的診斷
建置應用程式時,RDG 會針對原生 AOT 不支援的案例發出診斷。 診斷會發出為警告,且不會阻止建置應用程式。 如需診斷清單,請參閱 ASP.NET Core 要求委派產生器診斷。