如何在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:5132GET {{AOTtest_HostAddress}}/todos/
Accept: application/json###GET {{AOTtest_HostAddress}}/todos/1
Accept: application/json

在我们启动项目后,可以点击这里发送请求,就可以直接获取结果。

在这里插入图片描述
非常方便的高效测试。

7. 总结

本文介绍了AOT实战项目,并且详细分析了这个模板项目的内容。希望对你了解和掌握AOT新特性有一定的帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搞懂数据结构与Java实现

文章链接:搞懂数据结构与Java实现 (qq.com) 代码链接: Java实现数组模拟循环队列代码 (qq.com) Java实现数组模拟栈代码 (qq.com) Java实现链表代码 (qq.com) Java实现哈希表代码 (qq.com) Java实现二叉树代码 (qq.com) Java实现图代码 (qq.com)

【讲解下ECMAScript和JavaScript之间有何区别?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

swagger-ui.html报错404

问题1:权限受限无法访问 由于采用的Shiro安全框架,需要在配置类ShiroConfig下的Shiro 的过滤器链放行该页面:【添加:filterChainDefinitionMap.put("/swagger-ui.html", "anon");】 public ShiroFilterFact…

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时,dataGridView控件创建好后,左侧会多出一列为空,如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图: 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…

算力共享:如何理解、标识与调控多层次算力资源的异构性和复杂性,实现智能算力网生态诸要素有效互操作?

目录 鹏程云主机和NPU计算服务器关系 NPU计算服务器 两者关系 结论 两种不同类型的处理器或计算单元 FPGA MLU NS3(Network Simulator version 3) 一、基本属性 二、主要功能与特点 三、应用与前景 对象存储和HDD存储 一、定义与特点 二、应用场景 三、总结 对…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下: 本课题中…

【2025留学】德国留学真的很难毕业吗?为什么大家不来德国留学?

大家好!我是德国Viviane,一句话讲自己的背景:本科211,硕士在德国读的电子信息工程。 之前网上一句热梗:“德国留学三年将是你人生五年中最难忘的七年。”确实,德国大学的宽进严出机制,延毕、休…

PHP多场地预定小程序系统源码

一键畅游多地!多场地预定小程序的超实用指南 段落一:【开篇:告别繁琐,预订新体验】 🎉🚀 还在为多个活动或会议的场地预订而头疼不已吗?多场地预定小程序来拯救你啦!它像是一位贴心…

基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器

目录 简述 效果 功能描述 代码实现 总结 简述 基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器。 效果 先看效果: 下拉状态: 选择后状态: 选择的数据: 功能描述 1、加载树结构&…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复,查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

Git勤勉 两种方式上传

官网 勤勉Gitea 创建仓库 上传代码 可以先取个仓库名字 给个分支的名字就可以创建了 创建好了会出现一个链接 复制这个链接 打开要上传的项目 删除.idea/target/iml文件 cmd打开小黑窗 输入这个命令 初始化 添加仓库缓存 git init git xxx 把刚刚复制的链接放上去 gi…

【深度学习】大模型GLM-4-9B Chat ,微调与部署(3) TensorRT-LLM、TensorRT量化加速、Triton部署

文章目录 获取TensorRT-LLM代码:构建docker镜像并安装TensorRT-LLM:运行docker镜像:安装依赖魔改下部分package代码:量化:构建图:全局参数插件配置常用配置参数 测试推理是否可以代码推理CLI推理 性能测试小…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局,减需要分割两个模块选中,再点击spliter分割 2、在分割后,再对父界面进行布局设置 3、对于两边需要不等比列放置的,需要套一层 group box在最外层进行分割

从善如流之您最亲近人之善,肯出力之象-下学而上达

您最亲近人之善,肯出力之象,就是那个爬,甚至于跪倒在地上,抹那个下水井子。这或许就是那个马云大佬讲过的,就是从您最近距离,身边的人学习。人家为啥做的好,出色?而且您是一母同胞之…

基于微信小程序+SpringBoot+Vue的网络安全科普系统(带1w+文档)

基于微信小程序SpringBootVue的网络安全科普系统(带1w文档) 基于微信小程序SpringBootVue的网络安全科普系统(带1w文档) 优质的网络安全科普系统不仅可以单纯的满足工作人员管理的日常工作需求,还可以满足用户的需求。可以降低工作人员的工作压力,提高效…

LeetCode刷题笔记第682题:棒球比赛

LeetCode刷题笔记第682题:棒球比赛 题目: 想法: 遍历输入的列表,按照规则将分数和操作依次进行,存储在新建的列表中,最终输出列表中的元素和,代码如下: class Solution:def calPo…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞,通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段,对评估网络系统安全防护及措施至关重要,因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

第6篇文献研读生态廊道相关综述

该文发在生态与农村环境学报。该文章写了生态廊道概念的发展历程、生态廊道类型及功能、生态廊道划定的理论和方法、生态廊道的时间和国内大型生态廊道建设实践。 这篇文章可以让大家了解生态廊道的知识。

C语言实现K均值聚类

K均值聚类(K_means)基础理论 K_means聚类是一种简单且广泛使用的聚类算法,它旨在将数据集中的样本划分为k个不同的聚类,其中k是事先指定的聚类数量,该算法的核心思想是迭代地优化聚类中心,以最小化每个样本与其所属聚类中心之间的…

懂个锤子Vue 项目工程化进阶⏫:

Vue项目工程化进阶⏫: 前言: 紧跟前文,目标学习Vue2.0——3.0: 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的技术栈… 当然既然学习框架的了,HTMLCSSJS三件套必须的就不说了: JavaScript 快速入门 …