Microsoft, .NET 9.0 Önizleme 4'ü yayımladı
Microsoft, Build 2024 geliştirici konferansında .NET 9.0 Preview 4'ü yayımladı. .NET (önceki yıllarda olduğu gibi) konferansın açılış konuşmasında yer almadı. İki saat boyunca yapay zeka konusu tartışıldı. Bununla birlikte, Derleme Oturum Zamanlayıcısı'nda “.NET” arama terimi altında bazı canlı oturumlar bulabilirsiniz; örneğin C# 13.0 için Perşembe 17:30 CEST ve ilk olarak kararlı bir sürümde yayımlanan Entity Framework Core için MongoDB veritabanı sürücüsü. Mayıs ayı başında ve daha önce ASP.NET Core 9.0 ve Blazor 9.0'ın yanı sıra Entity Framework Core 9.0 ile ilgili dersler kaydedilmişti.
Duyuru
Entity Framework Core 9.0'daki İyileştirmeler
Entity Framework Core 9.0 nesne ilişkisel eşleştiricisinin dördüncü ön izleme sürümünde birçok heyecan verici yeni özellik bulunmaktadır. Bunlardan en önemlisi, bireysel özelliklerin türü olarak salt okunur nesne kümelerinin kullanılmasıdır. Entity Framework Core 8.0'da Microsoft, yazılı diziler ve listeler oluşturma yeteneğini tanıttı. List<int> bireysel mülkler için kullanılacaktır. PostgreSQL bu durumlar için kendi küme tipini sağlarken, diğer veritabanı yönetim sistemleri bir metin sütunundaki JSON dizileriyle eşleşir (örn. nvarchar(MAX) Microsoft SQL Server e'de TEXT SQLite'da).
Microsoft artık bu küme eşlemelerini salt okunur .NET türlerini kapsayacak şekilde genişletiyor IReadOnlyList, IReadOnlyCollection VE ReadOnlyCollectionListe 1'e bakınız.
public class DataTypeTest
{
public Int32 ID { get; set; }
…
#region Array-Typ-Mapping --> Neu in EFCore 8.0 (zuvor nur für PostgreSQL!)
[Comment("C#: byte[]")]
public byte[] ByteArray { get; set; }
[Comment("C#: short[]")]
public short[] ShortArray { get; set; }
[Comment("C#: int[]")]
public int[] IntArray { get; set; }
[Comment("C#: long[]")]
public long[] LongArray { get; set; }
//[Comment("C#: byte[]")] --> Immer noch nicht möglich in EFC 9.0 :-(
//public Int128[] Int128Array { get; set; }
[Comment("C#: string[]")]
public string[] StringArray { get; set; }
[Comment("C#: DateTime[]")]
public DateTime[] DateTimeArray { get; set; }
[Comment("C#: bool[]")]
public bool[] BoolArray { get; set; }
[Comment("C#: Guid[]")]
public Guid[] GuidArray { get; set; }
[Comment("C#: ABC[]")]
public ABC[] EnumArray { get; set; }
#endregion
#region Listen
[Comment("C#: List<int>")]
public List<int> IntList { get; set; }
[Comment("C#: List<Guid>")]
public List<Guid> GuidList { get; set; }
#endregion
#region ReadOnly-Listen (Neu in EFCore 9.0)
[Comment("C#: ReadOnlyCollection<int>")]
public ReadOnlyCollection<int> ReadOnlyCollection { get; set; }
[Comment("C#: IReadOnlyCollection<int>")]
public IReadOnlyCollection<int> IReadOnlyCollection { get; set; } = new List<int>();
[Comment("C#: IReadOnlyList<int>")]
public IReadOnlyList<int> IReadOnlyList { get; set; } = new List<int>();
#endregion
…
}
Liste 1: OR Eşlemesinde IReadOnlyList, IReadOnlyCollection ve ReadOnlyCollection
LINQ sorgularında salt okunur küme türlerini kullanabilirsiniz. Örneğin, Entity Framework Core 9.0 şu LINQ komut dizisini çevirir:
var resultSet = ctx.DataTypeTest
.Where(x => x.ReadOnlyCollection.Any(x => x >= 42))
.Select(x => new DataTypeTest() { ID = x.ID, ReadOnlyCollection = x.ReadOnlyCollection })
.ToList();
bu SQL sorgusunda:
SELECT "d"."ID", "d"."ReadOnlyCollection"
FROM "DataTypeTest" AS "d"
WHERE EXISTS (
SELECT 1
FROM json_each("d"."ReadOnlyCollection") AS "r"
WHERE "r"."value" >= 42)
Ayrıca, Entity Framework Core sürüm 9.0 Preview 4'ten başlayarak, karmaşık türleri kullanan gruplamalarla LINQ sorgularının SQL çevirisi mümkündür, örneğin:
var q2 = ctx.DataTypeTest
.GroupBy(b => b.KomplexerTyp)
.Select(g => new { g.Key, Count = g.Count() });
Bu, her ihtimale karşı bu SQL sorgusunu oluşturur KomplexerTyp isimleri verilen iki üye Feld1 VE Feld2 sahibi:
SELECT "d"."KomplexerTyp_Feld1", "d"."KomplexerTyp_Feld2", COUNT(*) AS "Count"
FROM "DataTypeTest" AS "d"
GROUP BY "d"."KomplexerTyp_Feld1", "d"."KomplexerTyp_Feld2"
(Resim: Dmytro Vikarchuk/Shutterstock)
iX ve dpunkt.verlag tarafından 19 Kasım 2024'te düzenlenecek BetterCode() .NET 9.0 çevrimiçi konferansında, www.IT-Visions.de adresindeki .NET uzmanları pratik örnekler kullanarak .NET 9.0'ın son sürümünü sunacaklar. Bunlar arasında .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, Entity Framework Core 9.0 ile OR eşlemesi, Windows Forms 9.0, WPF 9.0, WinUI, .NET MAUI 9.0 ile platformlar arası geliştirme ve bir perspektif yer alıyor. .NET 10.0'da.
Bilet satışları başladı bile; indirimli kör kuş biletleri program duyurusu öncesinde satışa sunuldu.
Azure Cosmos DB veritabanı sürücüsü iyileştirmeleri
Artık rol tabanlı erişim denetimini (RBAC) de destekleyen Azure Cosmos DB için Entity Framework Core veritabanı sürücüsünde ek iyileştirmeler mevcuttur. Cosmos DB sağlayıcısı, Entity Framework Core 6.0'dan bu yana ilkel koleksiyonlar için sınırlı desteğe sahiptir.
Sürüm 9.0, belge veritabanlarındaki ilkel koleksiyonlara yönelik meta verileri ve API yüzeylerini ilişkisel veritabanlarındakilerle birleştirerek bu desteği geliştirir. Bu, ilkel koleksiyonların modelleme API'si kullanılarak açık bir şekilde eşlenmesine olanak tanır ve öğe tipi özelliklerin yapılandırılmasına olanak tanır. Örneğin, artık gerekli (sıfır olmayan) dizelerin bir listesini şu şekilde eşleyebilirsiniz:
modelBuilder.Entity<Book>()
.PrimitiveCollection(e => e.Quotes)
.ElementType(b => b.IsRequired());
Ek olarak, Azure Cosmos DB için Entity Framework Core veritabanı sürücüsü artık geliştiriciler eşzamanlı erişim gerçekleştirdiğinde (örneğin ToList()) girişim. Ancak sürücü dahili olarak eşzamanlı erişimi desteklemez. Şimdiye kadar bunlar hâlâ mümkündü: Dahili olarak eşzamansız olarak çalıştırılıyorlardı ve yürütmenin sonuna kadar engelleniyorlardı. Bu, çıkmazlara yol açabilir. Bu durumda sürüm 9.0'da artık standartta bir çalışma zamanı hatası var. Şu anda eski davranışı şu şekilde geri yükleyebilirsiniz:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.ConfigureWarnings(b => b.Ignore(CosmosEventId.SyncNotSupported));
Ancak Microsoft, 2026 yılında çıkacak olan Entity Framework Core 11.0 sürümündeki Azure Cosmos DB sürücüsündeki senkronize çağrıları tamamen yasaklamak istediğini duyurdu. Yani en geç aşağıdaki gibi asenkron materyalizasyon işlemlerini kullanmanız gerekiyor. ToListAsync() kullanım.
ASP.NET Core Web API'si için yeni OAS kitaplığı
Microsoft, REST API'lerine yönelik bir OpenAPI spesifikasyonu oluşturmak için şu ana kadar harici NuGet paketi Swashbuckle.AspNetCore'u kullandı. Ancak yakın zamana kadar, Microsoft'un .NET 8.0'daki ASP.NET Core tabanlı web API'lerine genişlettiği yerel AOT derleyicisiyle uyumlu değildi (GitHub sorunu ve çekme isteğine bakın).
Geliştiricilerden gelen birçok şikayetin ardından Microsoft, OpenAPI spesifikasyonuna sahip bir JSON belgesinin oluşturulmasını sürüm 9.0 Preview 4'ten başlayarak Microsoft.AspNetCore.OpenApi paketine dahil etmeye başladı. Her ne kadar ASP.NET Core Web API proje şablonları henüz geliştiriciler bu paketi kullanarak çağrıları kullanarak projeleri kolayca yeniden oluşturabilirler
builder.Services.AddOpenApi();
VE
app.MapOpenApi();
program başlangıç dosyasına girin ve ardından ilgili openapi/v1.json URL'sindeki OAS JSON belgesini edinin. Ancak hızlı bir testte bu, yerel AOT derleyicisiyle hala çalışmıyor (hata: “InvalidOperationException: Yansıma tabanlı serileştirme bu uygulama için devre dışı bırakıldı”), ancak belgeler en az bir cümlede “Yerel ile uyumlu” belirtiyor AOT” . Ancak Microsoft, mevcut önizleme sürümlerinde henüz uygulanmayan gelecek sürümlere ilişkin belge hedeflerini sıklıkla belirtir. Ayrıca, yeni paket (Swashbuckle.AspNetCore'dan farklı olarak) şu ana kadar yalnızca bir JSON belgesi oluşturuyor ancak WebAPI için HTML tabanlı yardım ve test sayfası oluşturmuyor.
Ayrıca, WebAPI ve diğer ASP.NET Core tabanlı uygulamalar için ASP.NET Core WebAPI 9.0 Preview 4'te Microsoft, geliştirici bilgi sayfasını daha büyük yazı tipi boyutları, iyileştirilmiş boşluklar ve kesmelerle çalışma zamanı hataları için optimize etti. GitHub'daki bir animasyonda bir örnek görülebilir.
Internet Information Services (IIS) web sunucusundaki ASP.NET Core modülünün (ANCM) artık yeni bir ayarı var shutdownDelay. Bir uygulama işlemi geri dönüştürüldüğünde, çalışan bir uygulamanın ne kadar süreyle çalışmaya devam etmesi gerektiğini milisaniye cinsinden belirler. Eski ve yeni süreçlerin üst üste bindirilmesi, bir uygulamanın geri dönüşüm sırasında bile (örneğin kodu güncellerken) sürekli olarak erişilebilir olmasını sağlar.
Standart versiyonda Microsoft daha önce bu örtüşmeyi bir saniyeye ayarlamıştı ancak bazı durumlarda (yavaş sistem veya yüksek CPU yükü) bu yeterli olmuyordu. Uygulama operatörleri artık Web.config web sunucusu yapılandırma dosyasındaki ayarlar aracılığıyla kaplamayı kendileri kontrol edebilir:
<aspNetCore processPath="dotnet" arguments="myapp.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
<handlerSettings>
<!--
Milliseconds to delay shutdown of the old app app instance while the new instance starts.
Note: This doesn't delay the handling of incoming requests.
-->
<handlerSetting name="shutdownDelay" value="5000" />
</handlerSettings>
</aspNetCore>
Ayrıca mevcut dağıtılmış önbellek ve bellek önbellek uygulamalarını geliştiren yeni bir hibrit önbellek de bulunmaktadır. Microsoft, sürüm notlarında ayrıntıları açıklıyor.
Blazor'daki yenilikler
Sürüm 8.0'dan bu yana, Blazor'da, Blazor Server (etkileşimli sunucu tarafı oluşturma olarak da bilinir) ve Blazor WebAssembly'ye (istemci tarafı oluşturma olarak da bilinir) ek olarak, hem süreci hem de statik sunucuyu birleştiren bir otomatik oluşturma modu da mevcuttur. klasik çok sayfalı web uygulamaları için yan işleme. Önceden, Blazor Server, Blazor WebAssembly ve otomatik oluşturma modunu kullanarak sunucudaki statik olarak oluşturulmuş bir web uygulamasına tek sayfalık uygulamalardan oluşan adacıkları gömebiliyordunuz. .NET 9.0'da, geliştiriciler artık sunucuda tamamen statik olarak oluşturulan web sitelerini tek sayfalı bir uygulamaya da yerleştirebiliyor. Bunu yapmak için bir Razor bileşenine (.razor dosyası) şununla açıklama ekleyin:
@page "/impressum"
@attribute [ExcludeFromInteractiveRouting]
…
Tarayıcıda /imprint'e gittiğinizde, bu sayfa istemcide görüntülenmez veya bir WebSocket bağlantısı aracılığıyla sunucudan talep edilmez; bunun yerine tam bir HTTP isteğiyle birlikte sunulur. Davranışın App.razor dosyasında etkinleştirilmesi gerekir (bkz. Liste 2):
<!DOCTYPE html>
<html>
<head>
... other head content here ...
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="@InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
</html>
@code {
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private IComponentRenderMode? PageRenderMode
=> HttpContext.AcceptsInteractiveRouting() ? InteractiveServer : null;
}
Liste 2: Sunucuda statik olarak oluşturulan ayrı bileşenlere sahip bir Blazor sunucu uygulamasının App.razor'u (Kaynak: Microsoft)
Şuna: QuickGridBlazor'da kontrolü kullanarak artık sanallaştırma modunda aşırı taramayı ayarlayabilirsiniz; bu, halihazırda görünür olan alandan önce veya sonra kaç satırın hala yedek olarak oluşturulması gerektiğini belirler. Standartta ayarlanarak belirlenebilecek üç çizgi vardır. OverScanCount kontrol etiketinde değiştirilebilir:
<QuickGrid ItemsProvider="itemsProvider" Virtualize="true" OverscanCount="10">
...
</QuickGrid>
GUI çerçevelerindeki iyileştirmeler
Windows Sunum Vakfı (WPF) GUI kitaplığıyla oluşturulan uygulamalar için, Windows 11'deki .NET 9.0 artık mevcut Windows işletim sisteminin görünümüne ve tarzına otomatik uyarlama sunuyor. Bu, yuvarlatılmış köşeleri ve ayarladığınız Windows 11 temasını dikkate almayı içerir.
Yeni görselleştirmeyi Microsoft Store'dan önizleme olarak indirebileceğiniz WPF Galerisi'nde görüntüleyebilirsiniz. Uygulamayla ilişkili kaynak kodu GitHub'da mevcuttur.
WPF Galerisindeki WPF kontrollerine genel bakış
(Resim: Windows 11'de açık temalı ekran görüntüsü: Holger Schwichtenberg)
Platformdan bağımsız .NET Platformlar Arası Uygulama Kullanıcı Arayüzü (.NET MAUI) ayrıca Android 15 Beta 1'de de çalışır. Artık XAML denetimlerinde tarih, saat ve parola için sanal klavye girişi desteği de mevcuttur. <Editor> VE <Entry>Örneğin <Entry Keyboard="Date" />, <Editor Keyboard="Time" /> VE <Entry Keyboard="Password" />:
Bir denetimin tek görünümü aynı zamanda ilişkili XAML kodunu da gösterir.
(Resim: Windows 11'de karanlık temalı ekran görüntüsü: Holger Schwichtenberg)
.NET yenilikleri hakkında daha fazla bilgiyi bir Microsoft blog gönderisinde bulabilirsiniz.
(Mayıs)
Haberin Sonu