Request Delegate Generator (RDG) của ASP.NET Core cho 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:
- Là một source generator.
- Chuyển đổi mỗi phương thức
Mapthành một RequestDelegate được liên kết với route cụ thể. Các phương thứcMapbao gồm các phương thức trong EndpointRouteBuilderExtensions, chẳng hạn như MapGet, MapPost, MapPatch, MapPut, và MapDelete.
Khi publish và Native AOT không được kích hoạt:
- Các phương thức
Mapđược liên kết với một route cụ thể được biên dịch trong bộ nhớ thành một request delegate khi ứng dụng khởi động, không phải khi ứng dụng được build. - Các request delegate được tạo ra tại runtime (thời gian chạy).
Khi publish với Native AOT được kích hoạt:
- Các phương thức
Mapđược liên kết với một route cụ thể được biên dịch khi ứng dụng được build. RDG tạo ra request delegate cho route và request delegate được biên dịch vào native image (hình ảnh native) của ứng dụng. - Loại bỏ nhu cầu tạo request delegate tại runtime.
- Đảm bảo:
- Các type được sử dụng trong các API của ứng dụng được đặt gốc trong code ứng dụng theo cách có thể phân tích tĩnh bởi toolchain (chuỗi công cụ) Native AOT.
- Code cần thiết không bị loại bỏ.
RDG:
- Được kích hoạt tự động trong các project khi publish với Native AOT được kích hoạt hoặc khi trimming được kích hoạt.
- Có thể được kích hoạt thủ công ngay cả khi không sử dụng Native AOT bằng cách đặt
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>trong project file:
<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:
- Đánh giá tính tương thích của project với Native AOT.
- Giảm thời gian khởi động của ứng dụng bằng cách tạo trước các request delegate.
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:
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.