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

发布时间:2024年01月17日

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 是免费的、开源的、跨平台的框架,用于构建新式应用和强大的云服务。
文章来源:https://blog.csdn.net/weixin_36835848/article/details/135656317
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。