.NET 8下的AOT

相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。

使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短名称是api和webapi,api是一个更小,更基础的api模版,是通过WebApplication.CreateSlimBuilder来创建的,包含以下功能:.

  • appsettings.json 和 appsettings.{EnvironmentName}.json 的 JSON 文件配置
  • 用户机密配置
  • 控制台日志记录
  • 日志记录配置

由于AOT不支持反射,所以在代码中有反射的使用或使用三方库有反射时都无法使用AOT方式。那么在API中怎么把一个对象或集合返回给API或从API中接到JSON后怎么转成对象和集合呢?在.NET8的API项目中,使用的方式是源生成器,位于System.Text.Json中,下面看API模版代码理解吧。

using System.Text.Json.Serialization;using Demo03;
var builder = WebApplication.CreateSlimBuilder(args);builder.Services.ConfigureHttpJsonOptions(options =>{    options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
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();[JsonSerializable(typeof(Todo[]))]internal partial class AppJsonSerializerContext : JsonSerializerContext{}

通过给一个类AppJsonSerializerContext来添加特性[JsonSerializable(typeof(Todo[]))],来替换掉在对象和JSON之间的转换。

同时,AOT类型的项目也不能基于IIS来调试,所以对launchSettings.json作了调整。

下面是官方给出的功能支持力度,相当一部分功能已实现。但一些三方的功能也是需要时间对应的,好饭不怕晚,让我们静候AOT的到来吧。

功能 完全支持 部分支持 不支持
gRPC ✔️完全支持    
最小 API   ✔️部分支持  
MVC     ❌❌
Blazor Server     ❌❌
SignalR     ❌❌
Authentication     ❌(即将推出 JWT)
CORS ✔️完全支持    
HealthChecks ✔️完全支持    
HttpLogging ✔️完全支持    
本地化 ✔️完全支持    
OutputCaching ✔️完全支持    
RateLimiting ✔️完全支持    
RequestDecompression ✔️完全支持    
ResponseCaching ✔️完全支持    
ResponseCompression ✔️完全支持    
Rewrite ✔️完全支持    
Session     ❌❌
Spa     ❌❌
StaticFiles ✔️完全支持    
WebSockets ✔️完全支持