Trasformare i metodi di Mapping in delegati di richiesta con il generatore di delegati di richiesta di base ASP.NET
La ASP.NET Core Request Delegate Generator (RDG) è un generatore di origine in fase di compilazione che compila i gestori di route forniti a un'API minima per richiedere delegati che possono essere elaborati dall'infrastruttura di routing di ASP.NET Core. RdG viene abilitato in modo implicito quando le applicazioni vengono pubblicate con AoT abilitato o quando è abilitato il taglio. RdG genera codice descrittivo AoT nativo e trim.
Nota
- La funzionalità AOT nativa è attualmente in anteprima.
- In .NET 8, non tutte le funzionalità di ASP.NET Core sono compatibili con Native AOT.
The RDG:
- Generatore di origine.
- Trasforma ogni
Map
metodo in un RequestDelegate oggetto associato alla route specifica.Map
I metodi includono i metodi in EndpointRouteBuilderExtensions, ad esempio MapGet, MapPatchMapPost, MapPut, e MapDelete.
Quando la pubblicazione e native AOT non sono abilitate:
Map
i metodi associati a una route specifica vengono compilati in memoria in un delegato di richiesta all'avvio dell'app, non quando l'app viene compilata.- I delegati di richiesta vengono generati in fase di esecuzione.
Quando si esegue la pubblicazione con AOT nativo abilitato:
Map
i metodi associati a una route specifica vengono compilati al momento della compilazione dell'app. RdG crea il delegato di richiesta per la route e il delegato della richiesta viene compilato nell'immagine nativa dell'app.- Elimina la necessità di generare il delegato di richiesta in fase di esecuzione.
- Assicura:
- I tipi usati nelle API dell'app sono radicati nel codice dell'app in modo che sia analizzabile in modo statico dalla catena di strumenti AOT nativa.
- Il codice richiesto non viene eliminato.
The RDG:
- Viene abilitato automaticamente nei progetti quando la pubblicazione con AOT nativo è abilitata o quando è abilitata la rimozione.
- Può essere abilitato manualmente anche quando non si usa Native AOT impostando
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
nel file di progetto:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
</PropertyGroup>
</Project>
L'abilitazione manuale di RDG può essere utile per:
- Valutazione della compatibilità di un progetto con Native AOT.
- Riduzione del tempo di avvio dell'app pregenerando i delegati della richiesta.
Le API minime sono ottimizzate per l'uso System.Text.Jsondi , che richiede l'uso del generatore di origine System.Text.Json. Tutti i tipi accettati come parametri o restituiti dai delegati di richiesta nelle API minime devono essere configurati in un JsonSerializerContext oggetto registrato tramite l'inserimento delle dipendenze di 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
{
}
Diagnostica per scenari RDG non supportati
Quando l'app viene compilata, rdg genera diagnostica per gli scenari non supportati da AOT nativo. La diagnostica viene generata come avvisi e non impedisce la compilazione dell'app. Per l'elenco della diagnostica, vedere ASP.NET diagnostica del generatore di delegati di richiesta di base.