Przekształcanie metod mapowania w delegatów żądań za pomocą generatora delegatów żądań podstawowych ASP.NET
Generator ASP.NET Core Request Delegate Generator (RDG) to generator źródła czasu kompilacji, który kompiluje programy obsługi tras dostarczone do minimalnego interfejsu API w celu żądania delegatów, które mogą być przetwarzane przez infrastrukturę routingu ASP.NET Core. RdG jest niejawnie włączona, gdy aplikacje są publikowane z włączoną usługą AoT lub gdy jest włączone przycinanie. RdG generuje przycinanie i natywny kod przyjazny dla AoT.
Uwaga
- Natywna funkcja AOT jest obecnie dostępna w wersji zapoznawczej.
- Na platformie .NET 8 nie wszystkie funkcje platformy ASP.NET Core są zgodne z natywną funkcją AOT.
The RDG:
- Jest generatorem źródłowym.
- Zamienia każdą
Map
metodę RequestDelegate w skojarzona z określoną trasą.Map
metody obejmują metody w metodach EndpointRouteBuilderExtensions, takich jak MapGet, , MapPost, MapPatch, MapPut, i MapDelete.
W przypadku publikowania i natywnej funkcji AOT nie jest włączona:
Map
metody skojarzone z określoną trasą są kompilowane w pamięci do delegata żądania podczas uruchamiania aplikacji, a nie podczas kompilowania aplikacji.- Delegaty żądań są generowane w czasie wykonywania.
Podczas publikowania z włączoną natywną funkcją AOT:
Map
metody skojarzone z określoną trasą są kompilowane podczas kompilowania aplikacji. RdG tworzy delegata żądania dla trasy, a delegat żądania jest kompilowany do obrazu natywnego aplikacji.- Eliminuje konieczność wygenerowania delegata żądania w czasie wykonywania.
- Zapewnia:
- Typy używane w interfejsach API aplikacji są zakorzenione w kodzie aplikacji w sposób statycznie analizowany przez natywny łańcuch narzędzi AOT.
- Wymagany kod nie jest przycinany.
The RDG:
- Funkcja jest włączana automatycznie w projektach podczas publikowania za pomocą natywnej funkcji AOT lub w przypadku włączenia przycinania.
- Można włączyć ręcznie, nawet jeśli nie używasz natywnej AOT, ustawiając w
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
pliku projektu:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
</PropertyGroup>
</Project>
Ręczne włączanie rdG może być przydatne w następujących celach:
- Ocena zgodności projektu z natywną funkcją AOT.
- Skrócenie czasu uruchamiania aplikacji przez wstępne generowanie delegatów żądania.
Minimalne interfejsy API są zoptymalizowane pod kątem używania metody System.Text.Json, która wymaga użycia generatora źródłowego System.Text.Json. Wszystkie typy akceptowane jako parametry lub zwracane z delegatów żądań w minimalnych interfejsach API muszą być skonfigurowane na JsonSerializerContext obiekcie, który jest zarejestrowany za pośrednictwem iniekcji zależności ASP.NET Core:
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
{
}
Diagnostyka nieobsługiwanych scenariuszy rdG
Po utworzeniu aplikacji rdG emituje diagnostykę dla scenariuszy, które nie są obsługiwane przez natywną usługę AOT. Diagnostyka jest emitowana jako ostrzeżenia i nie uniemożliwia kompilowania aplikacji. Aby uzyskać listę diagnostyki, zobacz diagnostykę generatora delegatów żądań podstawowych ASP.NET.