1. 前言
前面的文章我们讨论过什么是AOT,以及AOT适用于什么场景, dotnet开发编译之争:Ahead-of-Time(AOT) vs Just-in-Time(JIT)谁才是未来最佳编译选择?,那么如何在Net8.0平台下开发AOT项目。
2. 先决条件
在安装的Visual Studio 2022的时候,将“ASP.NET 和 Web开发”和"C++桌面开发"都有安排上。
3. 项目准备
创建一个ASP.NET CORE Webapi (Native AOT)项目。这个项目的模板是使用了Asp.Net Core最小API的Restful Web API的项目模板。
如图所示:
或者使用.Net Core CLI命令来创建项目:
dotnet new webapiaot -o AOTtest
cd AOTtest
dotnet new sln -n "AOTtest"
4. 编译运行
通过运行发布配置,我们可知,无法正常发布。
所以,我们要使用.Net Core CLI命令来发布。发布成功的窗口如下:
打开发布Release所在的文件目录。可以看到目前的文件就一个应用程序
双击启动应用程序,可以在未安装.Net8的环境下运行了。
浏览器访问地址,可得结果
自此,我们就已经成功的将模板文件发布成功。
5. 分析AOT模板项目
一、先看完整的源码:
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
{
}
这段代码是一个基于 .NET 8 的 ASP.NET Core Web API 应用程序,使用了 Slim API 风格的路由配置。它定义了一个简单的 Todo RESTful API,并使用 System.Text.Json 进行 JSON 序列化和反序列化。
- 引入System.Text.Json.Serialization: 引入这个命名空间是为了在项目中使用 System.Text.Json 提供的 JSON 序列化和反序列化功能。
- 创建WebApplication实例: 使用 WebApplicationBuilder 创建一个应用构建器,通过 .CreateSlimBuilder(args) 方法初始化。
- 配置JsonSerializerOptions: 在服务容器中注册并配置 HTTP JSON 选项。这里插入自定义的类型信息解析器到链表的头部,以便在序列化和反序列化时使用 AppJsonSerializerContext 中的类型映射信息。
- 构建和运行应用程序: 调用 builder.Build() 构建应用程序实例,然后使用 app.Run() 启动应用监听HTTP请求。
- Todo模型定义: 定义了一个名为 Todo 的记录类型,表示一个待办事项,包括ID、标题、截止日期(DueBy)以及是否已完成(IsComplete)的状态。
- API路由设置:
- /todos/:GET 请求返回所有待办事项。
- /todos/{id}:GET 请求根据给定的 ID 返回单个待办事项。如果找到对应 ID 的待办事项,则返回 Results.Ok(todo);否则返回 Results.NotFound() 表示未找到资源。
- 数据初始化: 定义了一些示例待办事项存储在 sampleTodos 变量中。
- 自定义JsonSerializerContext: 定义了一个内部部分类 AppJsonSerializerContext,继承自 JsonSerializerContext。此上下文用于为 Todo 类型及其数组提供自定义的序列化和反序列化规则。通过 [JsonSerializable(typeof(Todo[]))] 特性标记,指示编译器生成相关的序列化逻辑。
总结起来,这段代码主要实现了一个简单的 REST API,用于管理一组待办事项,利用 .NET 8 的内置 JSON 序列化机制处理数据的传输,并且对序列化过程进行了自定义配置。
6. 关于.http文件
这个项目模板中,还有一个.http的文件,可能这个都比较少见,不知道干什么的。我之前的文章有介绍过。可以转链接查看 .http文件和终结点资源管理器。在这里,我们就简单介绍下。
@AOTtest_HostAddress = http://localhost:5132
GET {{AOTtest_HostAddress}}/todos/
Accept: application/json
###
GET {{AOTtest_HostAddress}}/todos/1
Accept: application/json
在我们启动项目后,可以点击这里发送请求,就可以直接获取结果。
非常方便的高效测试。
7. 总结
本文介绍了AOT实战项目,并且详细分析了这个模板项目的内容。希望对你了解和掌握AOT新特性有一定的帮助。