DotNET 8 新特性 - AoT 编译、 MinimalAPI、Json源生成器

AoT编译方式特性

裁剪减小体积,取消JIT编译,不使用反射技术。直接产生目标机器二进制代码,目前支持x86,解决被反编译问题。

  • 使用本机 AOT 发布的应用:
  • 最大程度减少了磁盘占用空间
  • 缩短了启动时间
  • 减少了内存需求

  • | 功能 | 完全支持 | 部分支持 | 不支持 |
    | — | — | — | — |
    | gRPC | ✔️完全支持 |
    |
    |
    | 最小 API |
    | ✔️部分支持 |
    |
    | MVC |
    |
    | ❌不支持 |
    | Blazor Server |
    |
    | ❌不支持 |
    | SignalR |
    |
    | ❌不支持 |
    | JWT 身份验证 | ✔️完全支持 |
    |
    |
    | 其他身份验证 |
    |
    | ❌不支持 |
    | CORS | ✔️完全支持 |
    |
    |
    | HealthChecks | ✔️完全支持 |
    |
    |
    | HttpLogging | ✔️完全支持 |
    |
    |
    | 本地化 | ✔️完全支持 |
    |
    |
    | OutputCaching | ✔️完全支持 |
    |
    |
    | RateLimiting | ✔️完全支持 |
    |
    |
    | RequestDecompression | ✔️完全支持 |
    |
    |
    | ResponseCaching | ✔️完全支持 |
    |
    |
    | ResponseCompression | ✔️完全支持 |
    |
    |
    | Rewrite | ✔️完全支持 |
    |
    |
    | 会话 |
    |
    | ❌不支持 |
    | Spa |
    |
    | ❌不支持 |
    | StaticFiles | ✔️完全支持 |
    |
    |
    | WebSockets | ✔️ |
    |
    |

条件

  • VS 2022预览版
  • DotNET 8 SDK

创建Minimal API

使用CreateSlimBuilder()模式

var builder = WebApplication.CreateSlimBuilder();builder.Services.AddRoutingCore().Configure<RouteOptions>(options => {options.SetParameterPolicy<RegexInlineRouteConstraint>("regex");
});

使用扩展方法构建OpenAPI

OpenAPI基于IEndpointRouteBuilder扩展方法创建MapGet、MapPost等来实现EndPoints

namespace Microsoft.AspNetCore.Builder
{//// 摘要://     Provides extension methods for Microsoft.AspNetCore.Routing.IEndpointRouteBuilder//     to add endpoints.public static class EndpointRouteBuilderExtensions{public static RouteHandlerBuilder MapDelete(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler);...}}

JSON 源生成器

在NET8的 AoT编译中不支持反射技术,对于Json序列化使用源生成器方式构建。

[JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Metadata)]
internal partial class MetadataOnlyWeatherForecastOnlyContext : JsonSerializerContext
{
}
builder.Services.ConfigureHttpJsonOptions(options =>{options.SerializerOptions.TypeInfoResolverChain.Insert(0, Device_ProjectJsonSerializerContext.Default);});
JsonSerializer.Serialize(reponse, Device_Model_Product_AssetsJsonSerializerContext.Default.APIResponseDevice_Model_Product_Assets)

最佳实践

    通过基于扩展WebApplication从而创建OpenAPI, 在Program中使用 app.MapProjectEndpoints();和builder.Services.AddTransient<ProductService>();注入Endpoint组件和Services组件来解耦。
   public static class ProductEndpoints{public static void MapProductEndpoints(this WebApplication app){var api = app.MapGroup("/api");var productApi = api.MapGroup("/product").WithGroupName("产品");productApi.MapGet("/list", (ProductService service) =>{return Results.Text(JsonSerializer.Serialize(new APIResponse<Device_Product> { Data = service.GetProductToList() }, Device_ProductJsonSerializerContext.Default.APIResponseDevice_Product));});}}
public class ProductService
{public List<Device_Product> GetProductToList(){return DBContext.DB.Queryable<Device_Product>().ToList();}
}

ORM兼容性

  • SqlSugar、FreeSQL等三方组件均已支持AoT编译。
  • 需要额外使用rd.xml配置文件(运行时指令)指定程序元素是否适用于反射,解决AoT编译链中兼容问题
<Directives><Application><Assembly Name="SqlSugar"  Dynamic="Required All"></Assembly><Assembly Name="OpenAPIServices"  Dynamic="Required All"></Assembly></Application>
</Directives>
  • .NET 是免费的、开源的、跨平台的框架,用于构建新式应用和强大的云服务。

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

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

相关文章

Unity中四元数常用的方法

单位四元数 #region 单位四元数print(Quaternion.identity);testObj.rotation Quaternion.identity;//初始化对象时可能会用来赋值Instantiate(testObj,Vector3.zero,Quaternion.identity);#endregion 插值运算 #region 插值运算 //四元数中也提供了如同Vector3的插值运算 /…

Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器(1)

文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待&#xff0c;只要有一个就绪&#xff0c;就使用select/poll系统调用&#xff0c;让操作系统把所有文件遍历一遍&#xff0c;哪些就绪就加上哪…

SQL-窗口函数

什么是窗口函数 可以像聚合函数一样对一组数据进行分析并返回结果&#xff0c;二者的不同之处在于&#xff0c;窗口函数不是将一组数据汇总成单个结果&#xff0c;而是为每一行数据都返回一个结果。 窗口函数组成部分 1.创建数据分区 窗口函数OVER子句中的PARTITION BY选项用…

拼多多无货源中转仓项目真的靠谱吗?发展前景如何?

阿阳最近一直在关注无货源电商这一块&#xff0c;尤其是拼多多无货源中转仓&#xff0c; 现如今也有了自己的运营团队和交付团队&#xff0c;整体来看这个项目还算不错&#xff01; 说实话&#xff0c;在考察这个项目的时候&#xff0c;看到市面上很多人在做&#xff0c;包括我…

一、VTK 9.0.0 编译安装步骤 VS2019 CMake3.26.0

零基础开始学习VTK &#xff0c;请跟我进行第一步&#xff0c;配置好开放环境&#xff01; 首先&#xff0c;你时间比较紧急&#xff0c;想直接使用VTK &#xff0c;而无需编译、那么请使用 PCL-1.12.0-AllInOne-msvc2019-win64.exe 它已经帮你编译好VTK 9 了&#xff0c;直…

echarts柱状图顶部设置倾斜并且展示数字

将下面代码直接复制粘贴在此运行就能查看效果Apache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。https://echarts.apache.org/examples/zh/editor.html?care…

AI制作《流浪地球3》高清宣传片

AI制作《流浪地球3》高清宣传片 星辰大海&#xff0c;再次启航&#xff0c;人类的冒险&#xff0c;永无止境。The vast expanse of stars and oceans, setting sail once again. Human adventure knows no bounds. 当家园变得遥不可及&#xff0c;我们唯有勇往直前。With our …

Docker部署Dubbo-Admin浏览器无法访问问题!

Dubbo配置开发环境 很多小伙伴在使用docker部署Dubbo-Admin会出现浏览器无法访问问题&#xff0c;但是虚拟机防火墙都是关着的&#xff0c;那么这可能是镜像源出现问题了&#xff0c;可以按照如下方法操作&#xff1a; 先将现有的镜像和容器全部删除&#xff08;配置完镜像源需…

[Python] 如何通过ctypes库来调用C++ 动态库 DLL?

ctypes库介绍 ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用C语言编写的函数和变量,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的…

【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享

文章目录 1.何为“上网”1.1 定义1.2 为什么连了WiFi就能上网了&#xff1f; 2.ip2.1 什么是ip2.2 为什么区分广域网和局域网&#xff0c;ip的唯一性2.3 如何查看设备的ip2.4 什么叫"ping"2.5 区分是否两个ip是否在同一局域网2.5.1 最稳妥的方式&#xff1a;ip&m…

第 2 章 数据结构和算法概述

文章目录 2.1 数据结构和算法的关系2.2 看几个实际编程中遇到的问题2.2.1 问题一-字符串替换问题2.2.2 一个五子棋程序2.2.3 约瑟夫(Josephu)问题(丢手帕问题)2.2.4 其它常见算法问题: 2.3 线性结构和非线性结构2.3.1 线性结构2.3.2 非线性结构 2.1 数据结构和算法的关系 数据 …

Javascript,到底要不要写分号?

小白随机在互联网上乱丢一些赛博垃圾&#xff0c;还望拨冗批评斧正。 要不要加分号&#xff1f; 先说结论&#xff1a;“不引起程序出错的前提下&#xff0c;加不加都可以&#xff0c;按自身习惯来。” 为什么JS可以不加分号&#xff1f; 实际上&#xff0c;行尾使用分号的风…

五、基础篇 vue列表渲染

在v-for里使用对象用 v-for 把一个数组对应为一组元素 我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in list形式的特殊语法&#xff0c;其中 list是源数据数组&#xff0c;而 item 则是被迭代的数组元素的别名。 <template><div clas…

【leetcode题解C++】54.螺旋矩阵I and 59.螺旋矩阵II

54.螺旋矩阵I 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;m…

C# 实现单线程异步互斥锁

文章目录 前言一、异步互斥锁的作用是什么&#xff1f;示例一、创建和销毁 二、如何实现&#xff1f;1、标识&#xff08;1&#xff09;标识是否锁住&#xff08;2&#xff09;加锁&#xff08;3&#xff09;解锁 2、异步通知&#xff08;1&#xff09;创建对象&#xff08;2&a…

Python单元测试之pytest的使用

一、前提准备 1、前提&#xff1a;需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 安装插件&#xff1a;pip install 插件名 2、命名规范 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开…

Spring(19) ThreadPoolTaskExecutor 线程池的使用

目录 一、线程池简介1.1 为什么使用线程池1.2 线程池为什么需要使用队列1.3 线程池为什么要使用阻塞队列而不是用非阻塞队列1.4 如何配置线程池1.5 execute() 和 submit() 方法 二、ThreadPoolTaskExecutor 线程池简介2.1 简介2.2 核心参数配置2.3 ThreadPoolTaskExecutor 内部…

数据库作业三

1.创建student和score表 2.为student表和score表增加记录 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 6.从st…

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1&#xff1a;当你使用FormData.from(Flutter3直接不能用)的时候&#xff0c;可能会提示没有这个方法&#xff0c;或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有&#xff0c;这时候可能就是和get库里面的Formdata冲突了 问题1&#xff1a;The me…

vue基于spring boot框架的发艺美发店理发店管理系统的设计q9xpe

店铺信息、美发信息是发艺美发店管理系统的重要组成部分&#xff0c;信息清晰、详细、准确&#xff0c;能够有效地促进发艺美发店管理系统的运行[5]。基础设定函数是对整个系统的总体布局进行合理安排&#xff0c;包括&#xff1a;店铺活动、物品信息、领用信息等。通过对各类资…