如何在Net8.0平台下开发AOT项目,项目实战分析

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 序列化和反序列化。

  1. 引入System.Text.Json.Serialization: 引入这个命名空间是为了在项目中使用 System.Text.Json 提供的 JSON 序列化和反序列化功能。
  2. 创建WebApplication实例: 使用 WebApplicationBuilder 创建一个应用构建器,通过 .CreateSlimBuilder(args) 方法初始化。
  3. 配置JsonSerializerOptions: 在服务容器中注册并配置 HTTP JSON 选项。这里插入自定义的类型信息解析器到链表的头部,以便在序列化和反序列化时使用 AppJsonSerializerContext 中的类型映射信息。
  4. 构建和运行应用程序: 调用 builder.Build() 构建应用程序实例,然后使用 app.Run() 启动应用监听HTTP请求。
  5. Todo模型定义: 定义了一个名为 Todo 的记录类型,表示一个待办事项,包括ID、标题、截止日期(DueBy)以及是否已完成(IsComplete)的状态。
  6. API路由设置:
  7. /todos/:GET 请求返回所有待办事项。
  8. /todos/{id}:GET 请求根据给定的 ID 返回单个待办事项。如果找到对应 ID 的待办事项,则返回 Results.Ok(todo);否则返回 Results.NotFound() 表示未找到资源。
  9. 数据初始化: 定义了一些示例待办事项存储在 sampleTodos 变量中。
  10. 自定义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新特性有一定的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotnet研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值