Partager via


Convertir les méthodes Map en délégués de requête avec le Générateur de délégués de requête ASP.NET Core

Le Générateur de délégués de requête ASP.NET Core est un générateur de source au moment de la compilation qui compile les gestionnaires de routage fournis à une API minimale pour les délégués de requête qui peuvent être traités par l’infrastructure de routage d’ASP.NET Core. Le RDG est implicitement activé lorsque les applications sont publiées avec AoT activé ou lorsque le découpage est activé. Le RDG génère du code adapté à l’AoT natif et de découpage.

Remarque

  • La fonctionnalité d’AOA natif est actuellement en préversion.
  • Dans .NET 8, toutes les fonctionnalités ASP.NET Core ne sont pas compatibles avec l’AOA natif.

Le RDG :

Lors de la publication avec AOT natif non activé :

  • Les méthodes Map associées à une route spécifique sont compilées en mémoire dans un délégué de requête lorsque l’application démarre, et non quand elle est générée.
  • Les délégués de requête sont générés au moment de l’exécution.

Lors de la publication avec AOT natif activé :

  • Les méthodes Map associées à une route spécifique sont compilées lorsque l’application est générée. Le Générateur de délégués de requête crée le délégué de requête pour la route et le délégué de requête est compilé dans l’image native de l’application.
  • Plus besoin de générer le délégué de requête au moment de l’exécution.
  • Garantit que :
    • Les types utilisés dans les API de l’application sont rootés dans le code de l’application d’une manière qui est statiquement analysable par la chaîne d’outils AOT natif.
    • Le code requis ne fait pas l’objet d’un « trimming » (suppression des parties inutilisées).

Le RDG :

  • Est activé automatiquement dans les projets lors de la publication avec AOT natif est activée ou lorsque le découpage est activé.
  • Cela peut être activé manuellement même si vous n’utilisez pas AOT natif, en définissant <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator> dans le fichier projet :
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
  </PropertyGroup>
    
</Project>

L’activation manuelle du Générateur de délégués de requête peut être utile pour :

  • Évaluation de la compatibilité d’un projet avec AOT natif.
  • Réduire le temps de démarrage de l’application en pré-générant les délégués de requête.

Les API minimales sont optimisées pour l’utilisation de System.Text.Json, ce qui implique l’utilisation du Générateur de source System.Text.Json. Tous les types acceptés en tant que paramètres ou retournés par les délégués de requête dans les API minimales doivent être configurés sur un JsonSerializerContext inscrit via l’injection de dépendances d’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
{

}

Diagnostics pour les scénarios RDG non pris en charge

Lorsque l’application est générée, le RDG émet des diagnostics pour les scénarios qui ne sont pas pris en charge par l’AOT natif. Les diagnostics sont émis sous forme d’avertissements et n’empêchent pas l’application d’être générée. Pour obtenir la liste des diagnostics, consultez Diagnostics du générateur de délégués de demande ASP.NET Core.