本週終於釋出了.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