Compartilhar via


Transforme os métodos Map em delegados de solicitação com o Gerador de Delegado de Solicitação do ASP.NET Core

O RDG (Gerador de Delegado de Solicitação) do ASP.NET Core é um gerador de fonte de tempo de compilação que compila manipuladores de rota fornecidos a uma API mínima para solicitar delegados que possam ser processados pela infraestrutura de roteamento do ASP.NET Core. O RDG é habilitado implicitamente quando os aplicativos são publicados com o AoT habilitado ou quando o corte está habilitado. O RDG gera o corte e o código nativo amigável ao AoT.

Observação

  • O recurso AOT nativo está atualmente em versão prévia.
  • No .NET 8, nem todos os recursos do ASP.NET Core são compatíveis com o AOT Nativo.

O RDG:

Ao publicar e o AOT Nativo não estiver habilitado:

  • Os métodos Map associados a uma rota específica são compilados na memória em um delegado de solicitação quando o aplicativo é iniciado, não quando o aplicativo é criado.
  • Os delegados de solicitação são gerados em runtime.

Ao publicar com o AOT Nativo habilitado:

  • Os métodos Map associados a uma rota específica são compilados quando o aplicativo é criado. O RDG cria o delegado de solicitação para a rota e o delegado de solicitação é compilado na imagem nativa do aplicativo.
  • Elimina a necessidade de gerar o delegado de solicitação em runtime.
  • Garante:
    • Os tipos usados nas APIs do aplicativo estão enraizados no código do aplicativo de uma maneira que pode ser analisada estaticamente pela cadeia de ferramentas de AOT Nativo.
    • Que o código necessário não seja cortado.

O RDG:

  • É habilitado automaticamente em projetos ao publicar com o AOT Nativo habilitado ou quando o corte está habilitado.
  • Pode ser habilitado manualmente, mesmo quando não estiver usando o AOT Nativo, definindo <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator> no arquivo do projeto:
<Project Sdk="Microsoft.NET.Sdk.Web">

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

Habilitar manualmente o RDG pode ser útil para:

  • Avaliação da compatibilidade de um projeto com o AOT Nativo.
  • Reduzir o tempo de inicialização do aplicativo, gerando previamente os delegados de solicitação.

As Minimal APIs são otimizadas para usar System.Text.Json, o que requer o uso do gerador de origem System.Text.Json. Todos os tipos aceitos como parâmetros para ou retornados de delegados de solicitação em Minimal APIs precisam ser configurados em um JsonSerializerContext registrado por meio da injeção de dependência do 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
{

}

Diagnóstico para cenários de RDG sem suporte

Quando o aplicativo é compilado, o RDG emite diagnósticos para cenários que não tem suporte no AOT Nativo. Os diagnósticos são emitidos como avisos e não impedem a criação do aplicativo. Para obter a lista de diagnósticos, consulte Diagnósticos do gerador do delegado de solicitação do ASP.NET Core.