.NET Core 3.0‘un RTM olarak yayınlanmasına yaklaşıyoruz. Büyük bir ihtimal Mayıs’taki Build etkinliğinde ya da ondan hemen sonra Haziran gibi yayınlanır diye düşünüyorum. Artık göreceğiz… Ciddi anlamda birçok yenilik ve performans iyileştirmeleri ile olgunlaşmaya devam ediyor. Bunlar dışında birçok değişiklik de v3.0’da karşımıza çıkıyor. Açıkçası yeni özelliklerden şu an çok bahsetmek istemiyorum hem kendi dokümantasyonları olsun hem internetteki birçok güzel kaynak olsun bunları takip etmek mümkün, -ki zaten üşenmiyor da değilim… 🙂 Şaka bir yana bir ara derleyip, toplamam lazım ki ben de günceliyim kendimi. Baya güzel özellikler geliyor çünkü. Neyse…

Malum .NET Core 3.0 ile beraber ASP.NET Core 3.0‘da yayınlanıyor. Orada da var güzellikler, ama dediğim gibi bu yeniliklerden de bahsetmeyeceğim(şimdi) daha çok değişikliklerden bahsetmeye çalışacağım. Çünkü ciddi anlamda önceki versiyonlarda(2.x) olan bazı temel özellikler değişiyor. Bu değişiklikler “breaking-changes” olarak adlandırabileceğimiz derecede, yani derlenebilen uygulamamızı .NET Core/ASP.NET Core 3.0’a yükselttiğimizde derlenemez hale gelebilmektedir, -duruma göre. Bunu hazırlık olsun diye, mevcut v2.2 projelerimizi preview versiyonlarını deneyimlerken yaşadığım için de ekstra paylaşmak istedim.

Shared Framework kullanımı değişiyor…


Şimdi biraz başa gidelim… .NET Core’un versiyon bazında tek başına çalışmasını sağlayan uygulama tipleri hayatımıza girmişti hatırlarsanız. Bunu sağlamak ve bazı geliştirmeler için kullandığımız tüm referansları tek bir çatı altında, aynı versiyonlar ile birleştirmek için ASP.NET tarafında Microsoft.AspNetCore.App şeklinde bir “package reference” proje dosyamızın içinde vardı, daha doğrusu olabiliyordu. Bu sayede aynı versiyon bileşenlerin kullanılması, versiyon karmaşıklığının olmaması sağlanıyordu.

Benzer şekilde bir de Microsoft.AspNetCore.All var. Bu da biraz daha kapsamlı olarak ek birkaç *.dll ile web uygulamalarında ihtiyacımız olabilecek referansları barındırıyordu. Bu sayede projemize ek bir referans eklemeden web projesinde olabilecek ihtiyaçları karşılayabiliyorduk. Microsoft.EntityFrameworkCore.Sqlite ya da Microsoft.Extensions.Configuration.AzureKeyVault gibi…

3.0 ile bu kullanımlar değişiyor. Artık proje dosyanızda bu kullanımları kaldırmamız gerekecek. Bu shared framework’lerin kendi içindeki referanslar değiştiği ve kaldırıldığı için böyle bir uyarıyı ilk olarak dikkate almamız gerekiyor.

Kaldırıldığı için mi? Ne kaldırılıyor?😱

ASP.NET Core 3.0 ile Newtonsoft.Json, Entity Framework Core ve Microsoft CodeAnalysis gibi bazı alt bileşenler ASP.NET Core 3.0 içerisinden kaldırılıyor. Kaldırılıyor derken çok olumsuz bir anlaşılma olmamasının, sadece ASP.NET Core framework’ü içerisinden kaldırıldığını, ayrıca eklenerek (Nuget paketi olarak) kullanılabileceğinin altını çizmek isterim. Diğer ihtiyaçlar için eklediğimiz Nuget paketleri gibi bunları da eklemek, v3.0 ile gerekecek. Bunun sebebi, ASP.NET Core’u biraz daha küçültmek, sadeleştirmek, çeşitli run-time performanslarını iyileştirmek diyebiliriz. Bu arada bunlar dışında başka alt bileşenlerde kalkıyor. Bunları GitHub‘dan takip edebilirsiniz

Özetle “<TargetFramework>netcoreapp3.0</TargetFramework> şeklinde proje dosyası içeriğini değiştirdiğinizde, eğer projenizde bu bileşenleri kullandıysanız hatalar alacaksınız. Hata aldığınız bileşenleri ayrıca eklemek gerecek. Bileşene göre ConfigureServices() kısmında onları özellikle de eklemek ( .Add…..(); ) gerekebiliyor.

WebHostBuilder gidiyor HostBuilder geliyor…

Bir ASP.NET Core projesi yarattığımız zaman, varsayılan şablon Program.cs’yi yaratır ve Hosting yapısı için WebHost sınıfı üzerinden uygulamanın nasıl ayağa kalkacağını, nasıl çalışacağını ayarlayabileceğimiz özellikleri sunup uygulamamızı çalışır hale getiriyordu. v3.0 ile bu yapı değişmeye başlıyor. Başlıyor diyorum çünkü direkt tak diye değişmiyor. v3.0 değişikliği ile projemizi derlediğimiz zaman bu sınıf deprecated(Obsolete) olarak işaretlendiği için uyarılar alacağız. WebHost‘u değil de artık Host sınıfını kullanın diye… Ama bunun dışında bu yapıdaki değişikliklerden dolayı Startup sırasında katabileceğimiz ara yüzler de sadece IHostingEnvironment ve IConfiguration olacak. WebHost bir süre daha olacak ama ilerleyen versiyonlarda kesin kalkacağı için dikkat etmek gerekli. Bu farkındalık önemli diye özellikle paylaşmak istedim. (-ki v3.0 ile zaten önceki 2.x versiyonunda obsolete olarak işaretlenen sınıflar kalkıyor.)

Bu uyarılar önemli, çünkü bir sonraki versiyonda WebHost da kaldırılacak. WebHost’un daha genel kullanıma uygun bir yapıya (Host) evirilmesinin de bir sebebi var tabi ki. Web uygulamalarının daha geniş host senaryolarını karşılayabilmesi için bu değişiklik yapılıyor. Yani sadece Http senaryoları için değil, arka-plan işler, mesajlaşma protokolleri gibi ayrı web yaklaşımlarını da sade bir şekilde destekleyebilmek için böyle bir değişikliğe gidiliyor. Buradaki değişiklikler yenilik olarak v2.1 ile yavaştan gelmeye başlamış ve yol haritası göz kırpmaya başlamıştı aslında. v3.0 ile beraber artık daha net. Kaldırılacak interface ve yeni gelen interface’lere dikkat etmek gerecek özetle.

ASP.NET Core 3.0(???) 🤔

Biraz kafa karışıklığına ve soru işaretlerine yol açan diğer değişikliğe sıra geldi. ASP.NET Core 3.0 artık sadece .NET Core 3.0 üzerinde çalışacak. Yani v3.0 ile beraber ASP.NET Core’un yeni özelliklerini .NET Framework ile kullanamayacağız. Bildiğiniz gibi .NET Standart ile .NET dünyasındaki tüm API’ların bir çatı altında toplanması ve aynı çalışma yaklaşımın olması hedefleniyor(du). Yani .NET ekosistemindeki bir API, ekosistemdeki tüm canlılar (.NET Core, .Net Framework, Xamarin, UWP…vs.) için aynı olacaktı. ASP.NET Core 3.0 ile artık böyle değil. Biraz daha açıklayıcı olması için .NET Core tarafında olan yeni bir özelliğin, .NET Framework’de olmama durumu olabileceğinden, ASP.NET Core 3.0 uygulamaları runtime olarak .NET Framework üzerinde sağlıklı çalışmayacak. Şu an böyle bir durum var mı bilemiyorum ama .NET Core ve dillerde yapılacak yeniliklerin .NET Framework’de olmayabileceğinin işaretini alıyorum. Yarın öbür gün C# 9.0 versiyonu, .NET Framework’ün desteklemediği ya da .NET ekosistemindeki bir özelliğin .NET Framework tarafından desteklenmeyeceği hissiyatına kapılıyorum. Bu kararın mevcut legacy uygulamalarının düşünüldüğü gibi .NET Core’a hızlıca dönüştürülemediği için, tüm yatırımların .NET Core tarafına yoğunlaştığı için zorlayıcı olması adına alındığını düşünüyorum. Ama tabi bilemeyiz.

Başka değişiklikler de var tabi ki ama direkt en kritik olarak bunlar karşımıza çıkıyor, sizin de başka karşılaştığınız durumlar olduysa yorum olarak paylaşabilirseniz süper olur.

Artık çok hızlı değiştiğimiz, çok hızlı ve sık değişikliklerle karşılaştığımız zamanlardayız. Özellikle yazılım dünyasında gittikçe de hızlanıyoruz. Bundan dolayı çıkan teknolojileri “alpha, beta, preview, release candidate…” şekillerinde önümüzde gördüğümüzde, bunları deneyimlemek hızlı değişmek ve adaptasyon için şart. Değişiklikler için cesur olup ilerlemek geliştirdiğimiz çözümlerin yaşam süresini uzatacaktır…


Bir sonraki yazıya kadar, mutlu değişiklikler. 🙂