本周终于发布了.NET Core 2.2,ASP.NET Core 2.2以及Entity Framework Core 2.2,虽然更大的新闻可能是.NET Core 3.0的特性公布,但不妨先将现有的.NET Core版本升级到2.2,及时体验一下新的功能。
.NET Core 2.2
分层编译
分层编译特性使得运行时可以更灵活地使用JIT编译器,从而提升在启动方面和最大化吞吐量上的性能。该特性在.NET Core 2.1时已作为可选特性加入其中,在.NET Core 2.2的预览版本中被默认使用,而到了最终发布阶段,还是改回了可选特性。.NET Core 3.0之后或许会成为默认选项吧。
运行时事件
为了获悉在运行应用程序时服务的工作情况,需要监测在当前进程中的诸如垃圾回收,JIT和线程池等运行时服务。在Windows系统中,一般ETW(Event Tracing for Windows) 的监测功能就可以满足此要求。但在.NET Core 2.2之前,ETW的执行效果并不令人如意。
现在, 通过EventListener类可以使用CoreCLR事件。这些事件描述了垃圾回收,JIT,线程池和interop的行为。它们在Windows上作为CoreCLR ETW provider的一部分对外公开。这将允许应用程序可以使用这些事件,又或者使用传输机制发送给其它监测服务。
在SqlConnection中提供对AccessToken的支持
SQL Server的ADO.NET provider,SqlClient,现在支持通过设置AccessToken属性以认证使用Azure Active Directory的SQL Server连接。该属性包含在Microsoft.IdentityModel.Clients.ActiveDirectory类库里。
在Main方法之前插入代码
现在通过Startup Hook可以在运行应用程序的Main方法之前插入特定的代码。对于已经发布的应用程序,不用重新编译或者改变程序,Startup Hook能够定制所需的行为。
Windows ARM32
与.NET Core 2.1中对Linux ARM32支持相似的,在.NET Core 2.2里加入了对Windows ARM32的支持。但在发布时遇到了较严重的bug,所以可能在之后的版本中,比如2019年1月即将发布的.NET Core 2.1.1中会真正附加此特性。
平台支持
NET Core 2.2支持下列操作系统:
- Windows Client: 7, 8.1, 10 (1607+)
- Windows Server: 2008 R2 SP1+
- macOS: 10.12+
- RHEL: 6+
- Fedora: 26+
- Ubuntu: 16.04+
- Debian: 9+
- SLES: 12+
- openSUSE: 42.3+
芯片支持包括:
- x64 on Windows, macOS, and Linux
- x86 on Windows
- ARM32 on Linux (Ubuntu 16.04+, Debian 9+)
- ARM32 on Windows (1809+; available in January)
ASP.NET Core 2.2
这次的更新主要是为了提高开发者的生产力以及增强创建Web/HTTP API的功能。同时,也在性能方面有所改善。这些更新包含以下几点:
- 与Swagger类库更好地集成,代码分析提供了设计时检查。
- 引入终端路由,提升了MVC中20%的路由性能
- 改进LinkGenerator的URL生成,支持路由参数转换
- 加入了对于应用程序的健康进行监测新API(此功能来源自和BeatPulse项目的集成)
- 由于进程内托管的支持,在IIS上提升了400%的吞吐量
- 提升了15%的MVC模型验证性能
- 在MVC中加入了对问题明细(Problem Details)(RFC 7807)的支持
- 在ASP.NET Core中可以预览对HTTP/2 server的支持
- 对于Bootstrap 4与Angular 6模板的升级
- 提供了ASP.NET Core SignalR的Java客户端
- 在Linux上提升了60%的HTTP客户端性能,同时在Windows上提升了20%
Entity Framework Core 2.2
支持空间数据
空间数据可以用于表示物理距离和目标形状。在EF Core 2.2中借助NetTopologySuite类库的帮助对空间数据提供了支持。当前已支持的数据库包括SQL Server,SQlite和PostgreSQL。
所有型实体(owned entity)集合
所有型实体中仅可以出现其它实体类型的导航属性。
EF Core 2.0中新加了一对一关联的所有型实体,而在EF Core 2.2中则进一步地扩展到了一对多的关联。
查询标签
该特性简化了代码中Linq语句与日志中生成的SQL语句之间的关联。
加上标签的方法是TagWith。
var nearestFriends =
(from f in context.Friends.TagWith(@"This is my spatial query!")
orderby f.Location.Distance(myLocation) descending
select f).Take(5).ToList();
最后生成的SQL语句中包含了Linq代码中附加的标签。
-- This is my spatial query!
SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC