.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✔️完全支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值