• 开发AOT项目需要注意哪些事项?
  • 发布于 2个月前
  • 120 热度
    0 评论
  • 追梦魂
  • 0 粉丝 37 篇博客
  •   
AOT项目有特殊模版的,目前支持AOT的模版有Mini API和gRPC。对于Mini API的AOT项目,有几个不同点,下面是我简化后针对开发的不同点:
1.使用 CreateSlimBuilder() API 确保默认情况下仅启用基本功能,从而最大程度地减小应用的部署大小。
2.配置为仅侦听 HTTP,因为 HTTPS 流量通常由云原生部署中的入口服务处理。
3.将 PublishAot 添加到项目文件,<PublishAot>true</PublishAot>。
4.启用 JSON 序列化程序源生成器。源生成器用于在生成时生成序列化代码,这是本机 AOT 编译所必需的。

5.不能动态反射,不支持动态加载文件,不支持动态编译


.NET的很多三方库,包括官方的Json序列化器,都有使用反射,所以在开发时要特别注意,这些不支持的库,要避免使用。

举几个简单例子,普通反射是可以用的,如果反射的类是显式的,是没有问题,但如果类型是隐式的,比如反射泛型的类型,返回为空。其实只要调用一次type.GetMembers(),让编译器留下类型成员,就可以使用泛型反射,也就是提前得知类型组成,后期在反射时使用即可。如果这样的话,不建议每个类型提前获取成员,不如用源生成器提前把所有类型成员都提取成一个资源文件,然后在对应的功能处,使用该资源文件即可。

再有就是如果用 [JsonConverter(typeof(JsonStringEnumConverter))]来标识枚举,不会起作用,换成 [JsonConverter(typeof(JsonStringEnumConverter<Sex>))]来显示告知Sex才行。

另外还有一个要命的事,就是AOT项目调试模式的表现和发布后的表现不一致,就像上面两个点,在VS中运行,一点毛病没有,发布后运行,就会发现行为不一致,所以这里也是一个坑,相信随着AOT成熟,这块会有改善。

总体来说,在开发AOT项目时,建议开发完一块,就要发布一下,验证哪里有问题,早发现早改进。第二就是一定要了解使用的库,确保这些库完美支持AOT。第三就是一定通过性能测试来验证项目的可靠性。
用户评论