.Net 6 ve Yenilikleri #1 (Preview 1 & Preview 2)

.Net dünyası yeni bir versiyon hazırlığında. .Net 5 yayını oldukça önemli bir dönüş noktasıydı ve bu süreci tamamladık. Umarım projelerinizde .Net 5 upgrade yapmışsınızdır çünkü yeni bir sürüme geçmenin en kolay yolu bir önceki sürümde hazır ve nazır beklemektir. 🧐 Eğer projeleriniz .Net Core 2.x veya .Net Core 3.x sürümlerinde ise adım adım upgrade yapmanızı öneririm aksi takdirde çok fazla breaking change ile karşı karşıya kalabilirsiniz.

.Net 5 sürümünde aramıza katılan ve aramızdan ayrılan özelliklerin listesini görmek ister misiniz? 🤔 Cevabınız evet ise o zaman aşağıdaki linklere tıklayabilirsiniz. 🎉
(.Net 5 ve Yenilikleri #1-.Net 5 ve Yenilikleri #2)

Geçtiğimiz günlerde .Net 6 Preview 1 ve Preview 2 yayımlandı. Release çıkana kadar sanırım yaklaşık altı veya yedi adet preview sürümü gelecek. Kullandığımız teklonojileri iyi takip etmek ve gelişmelerden haberdar olmak için her preview sürümünde gerçekleşen yenilikleri kaleme almaya çalışacağım. 🎉

.Net 6 sürümü ile hedeflenen en temel feature .Net 5 ile başlayan birleştirme senaryosunun son kısımlarını sunmaktır.
Her yeni sürümde olmazsa olmazlardan performans iyileştirmeleri de Preview 1 sürümünde duyuruldu.
Planlanan yayın tarihi Kasım 2021. Şu anda LTS (Long Term Support) .Net Core 3.1 sürümünde ancak planlamalara göre .Net 6 yayımlandıktan sonra üç yıl süre ile LTS alacaktır.

Eğer planlamayı daha net bir şekilde görmek istiyorsanız temalarof.net uygulamasını kullanabilirsiniz.

Bu sürümde runtime performance iyileştirmeleri ve .NET MAUI hazırlıklarının yapıldığını görüyoruz. Yazının içerisinde .NET MAUI, ASP.NET Core ve Entity Framework Core olmak üzere üç aşamada gelen yenilikleri aktarmaya çalışacağım.

Öncelikle MAUI, Xamarin.Forms’un yeni bir sürümü değil mobil geliştirme deneyimini daha iyi bir şekilde sunmak için tasarlanmış yeni bir framework olduğunu belirtmekte fayda var.

Xamarin.Forms ile cross-platform mobil uygulama geliştirebiliyoruz. Xamarin.Forms ile uygulama geliştirirken her ortam için ayrı bir template üzerinde geliştirme yaparken .NET MAUI ile bu farklı template üzerinde uygulama geliştirme senaryosu değişiyor artık tek bir proje ve tek bir codebase üzerinde tüm platformlar için uygulama geliştirebileceğiz.

Xamarin.Forms XAML ile uygulamalarımızı geliştirebiliyoruz .NET MAUI’da ek olarak MVU desteğinin olduğunu belirtmekte fayda var.

.NET MAUI ile birlikte font,images ve app iconlarını tek bir yerden shared olarak yönetebilirsiniz. Tabi bu ortak yer *.csproj dosyanız olacaktır.

<ItemGroup>
<SharedImage Include="appicon.svg" ForegroundFile="appiconfg.svg" IsAppIcon="true" />
<SharedFont Include="Resources\Fonts\ionicons.ttf" />
</ItemGroup>

Xamarin.Forms üzerinde çok fazla deneyimim olmadığı için döküman üzerinde okuduklarım ve yorumlayabildiklerim biraz sınırlı. 😢 Ancak daha detaylı inceleme yapmak isteyenler için sample projenin adresine buradan ulaşabilirsiniz.

.Net Core 3.0 ile hayatımıza giren System.Text.Json Newtonsoft.json kütüphanesinin yerini almada oldukça kararlı görünüyor. ✨

.Net Core 3.0 sürümünde aşağıda belirtilen bazı eksiklikler gözümüze batıyordu.

  • ReferenceLoopHandling
  • MissingMemberHandling
  • PreserveReferencesHandling

.Net 6 Preview 2 sürümünde bu eksikliklerden ReferenceHandler.IgnoreCycles giderildiğini görüyoruz.

Bu yeni extension aslında Newtonsoft.json üzerinde kullandığımız ReferenceLoopHandling.Ignore işlemini bizim için gerçekleştiriyor.

İlerleyen aşamalarda System.Text.Json içerisine yeni özellikler eklenip Newtonsoft.Json kütüphanesinin yerini alması bekleniyor.

Bu özelliği ilk gördüğümde nedendir bilmem ama çok hoşuma gitti. 🤔
Daha önce böyle bir yapıya ihtiyacım mı oldu acaba neden bu kadar hoşuma gitti diye düşünmeye başladım ancak ne kadar düşünsemde geçmişte geliştirdiğim algoritmaların içerisine yerleştirebileceğim bir senaryo bulamadım ama eminim ileride bir gün ihtiyacım olacaktır. 🤣
Kısacası System.Collections.Generic üzerinde bulunan bu yapı ile oluşturduğunuz Queue(Kuyruk) yapılarına priority verebilirsiniz. Ayrıca dequeue gibi işlemlerde artık verdiğiniz priority bilgisine göre işlem yapılacağını belirtmekte fayda var. Normalde Queue yapıları FIFO (First In First Out) mantığı ile çalışır ancak PriorityQueue ile artık bunu customize edebileceğiz.

// creates a priority queue of strings with integer priorities
var pq = new PriorityQueue<string, int>();

// enqueue elements with associated priorities
pq.Enqueue("A", 3);
pq.Enqueue("B", 1);
pq.Enqueue("C", 2);
pq.Enqueue("D", 3);

pq.Dequeue(); // returns "B"
pq.Dequeue(); // returns "C"
pq.Dequeue(); // either "A" or "D", stability is not guaranteed.

.Net 5 ile kıyasladığımızda build süreleri üzerinde bir performance artışı olduğunu görüyoruz. Tabi bu grafikler Microsoft’un bizlerle paylaştığı rakamlar ile süslenmiş. Gerçek hayattan örnekler vererek bu grafiğin doğruluğunu artıralım. Enis Necipoğlu Hocam ile .Net 6 ile gelen yenilikleri tartışırken bu grafiğe baktığımızda kendisinin ağzından dökülen cümleyi olduğu gibi sizlerle paylaşıyorum.
“Evet build süreleri için yapılan bu iyileştirmeyi biz de kendi projelerimizde gözle gördük. Normalde CI içerisinde buildler x dakika sürerken şu anda x-y dakika sürüyor.”

Yeniliklerden bahsetmeden önce Breaking changes olarak nitelendirebileceğimiz Obsoleted veya removed olarak işaretlenmiş Api’leri buradan görebilirsiniz.

Blazor componentleri, MVC ve Razor Page için CSS isolation desteği bu sürüm ile hayatımıza girmiş bulunmakta. Özel bir CSS dosyası eklemek için *.cshtml dosyası ile eşleşen bir *.cshtml.css dosyası ekleyerek CSS isolation özelliğini kullanabilirsiniz. Böylece sadece ilgili sayfa veya ilgili component için CSS yazabilirsiniz.

Bu sürüm özellikle Entity Framework Core için oldukça kullanışlı yeni özellikler barındırıyor. ✨

Örneğin Customer isimli bir tablomuz olsun ve “PhoneNumber1”,“PhoneNumber2”,“PhoneNumber3” isimli sütunları barındırsın.

Bu alanların hepsine sorgu atmak istediğimizde aşağıdaki gibi bir kod yazmak genellikle ilk akla gelen yöntem oluyor.

var data = dbContext.Customers.Where(x=>x.PhoneNumber1 != "test" && x.PhoneNumber2 != "test" && x.PhoneNumber3 != "test");

Üretilen SQL Sorgusu;

string.Concat ile bu sorguyu daha okunaklı ve basit bir şekilde yazabilirsiniz.

var data = dbContext.Customers.Where(x=> string.Concat(x.PhoneNumber1,x.PhoneNumber2,x.PhoneNumber3)!= "test");

Üretilen SQL sorgusu;

Bazen json tipinde dataları ilişkisel veri tabanı içerisinde saklamak gerekiyor. Örneğin kullandığınız servisin datasını saklamak istiyorsunuz ancak servisten dönen her field için tanımlama yapmak imkansız bunun yerine string bir alan içerisinde bu datanın json formatındaki halini saklıyoruz. Tabi dezavantajları oluyor datayı her okuduğumuzda deserialize etmek kaydederken tekrar serialize etmek kod içerisinde okunaksız ve kendini tekrar eden bir yapı oluşturuyor. Bu alanları sorgulamak istediğimizde genellikle EF.Functions içerisinde olan FreeText extensionını kullanıyoruz.

Bu sürüm ile EF.Functions parametreleri biraz daha gevşek bir hale getirildi. İçeriğinizin string olmasa bile Contains veya FreeText ile sorgu atabilirsiniz. Ek olarak DbContext içerisinde System.Text.Json kullanarak bu objeleri okuma ve yazma esnasında Serialize veya Deserialize edebilirsiniz.

public class Customer
{
public int Id { get; set; }

public Name Name{ get; set; }
}

public class Name
{
public string First { get; set; }
public string MiddleInitial { get; set; }
public string Last { get; set; }
}
modelBuilder.Entity<Customer>()
.Property(e => e.Name)
.HasConversion(
v => JsonSerializer.Serialize(v, null),
v => JsonSerializer.Deserialize<Name>(v, null));
var result = context.Customers.Where(e => EF.Functions.Contains(e.Name, "Martin")).ToList();SELECT [c].[Id], [c].[Name]
FROM [Customers] AS [c]
WHERE CONTAINS([c].[Name], N'Martin')

NOT : Provider olarak SQL Server kullanıyorsanız Full-Text-Indexed özelliğini açmanız gerektiğini unutmayınız.

Solution Developer — I want to change the world, give me the source code.

Medium independent DevOps publication. Join thousands of aspiring developers and DevOps enthusiasts