Condividi tramite


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:

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.