Share via


使用 ASP.NET Core 要求委派產生器將 Map 方法轉換成要求委派

ASP.NET Core 要求委派產生器 (RDG) 是一種編譯時間來源產生器,可編譯已提供給基本 API 的路由處理常式,以要求能夠由 ASP.NET Core 路由基礎結構處理的委派。 在已啟用 AoT 或已啟用修剪的情況下發佈應用程式時,RDG 會以隱含的方式啟用。 RDG 會產生修剪和原生 AoT 易記程式碼。

注意

  • 原生 AOT 功能目前為預覽版。
  • 在 .NET 8 中,並非所有 ASP.NET Core 功能都與原生 AOT 相容。

RDG:

啟用原生 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 要求委派產生器診斷