Nguon: Microsoft Learn · .NET 8.0

Request Delegate Generator (RDG) của ASP.NET Core cho Native AOT

Nguồn: ASP.NET Core Request Delegate Generator (RDG) for Native AOT

ASP.NET Core Request Delegate Generator (RDG - Bộ tạo Request Delegate) là một source generator (bộ tạo source) tại compile-time (thời điểm biên dịch) biên dịch các route handler (trình xử lý route) được cung cấp cho Minimal API thành các request delegate (delegate yêu cầu) có thể được xử lý bởi cơ sở hạ tầng routing (định tuyến) của ASP.NET Core. RDG được kích hoạt ngầm định khi ứng dụng được publish với AOT được kích hoạt hoặc khi trimming được kích hoạt. RDG tạo ra code thân thiện với trim (cắt gọn) và native AOT.

- Tính năng Native AOT hiện đang ở trạng thái preview (xem trước). - Trong .NET 8, không phải tất cả các tính năng ASP.NET Core đều tương thích với Native AOT.

RDG:

Khi publish và Native AOT không được kích hoạt:

Khi publish với Native AOT được kích hoạt:

RDG:

xml
<Project Sdk="Microsoft.NET.Sdk.Web">

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

Kích hoạt RDG thủ công có thể hữu ích cho:

Minimal APIs được tối ưu hóa để sử dụng System.Text.Json, yêu cầu sử dụng System.Text.Json source generator. Tất cả các type được chấp nhận làm tham số hoặc được trả về từ các request delegate trong Minimal APIs phải được cấu hình trên một JsonSerializerContext được đăng ký thông qua dependency injection (tiêm phụ thuộc) của ASP.NET Core:

csharp
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 (Chẩn đoán) cho các kịch bản RDG không được hỗ trợ

Khi ứng dụng được build, RDG phát ra diagnostics cho các kịch bản không được hỗ trợ bởi Native AOT. Các diagnostic được phát ra dưới dạng cảnh báo và không ngăn ứng dụng build. Để biết danh sách các diagnostic, xem ASP.NET Core Request Delegate Generator diagnostics.