.Net Core 2.0: .Net Dünyası Kökünden Değişmeye Hazır mı?

Microsoft sonunda uzun süredir beklediğimiz .Net Core 2.0'ı 14 Ağustosta yayınladı. Beraberinde .Net Standard 2.0, Asp.Net Core 2.0 ve Entity Framework 2.0 da yayınlanmış oldu.

Biz de Codefiction olarak bir süredir yapmayı düşündüğümüz sezon finalimizde bu konuyu tartıştık. Yer yer övdüğümüz yer yer eleştirdiğimiz keyifli bir yayın oldu.

.Net Core 1.0 (ve 1.1) ilk çıktığında aslında büyük oranda vaad ettiği şeyleri yerine getiriyordu. Bunlardan en önemlisi .Net’in artık sadece Windows’da değil, bir sürü Linux Distro’su ve MacOs’da da çalışabilecek olmasıydı. Ama bu durum büyük oranda bir projeye sıfırdan .Net Core ile başlıyorsanız geçerliydi.

.Net Framework 15 yıllık bir platform, bu güne kadar üzerinde sayısız uygulama geliştirilmiş ve geliştirilmeye devam ediyor. İşte .Net Core’un ilk sürümdeki en büyük sıkıntı, .Net Framework’le geliştirilmiş mevcut uygulamaların .Net Core port edilmesiydi. Bunun için .Net Standard çözümünü çıkarttılar ama desteklenen API sayısı sınırlıydı ve bir çok eski legacy uygulamanın .Net Core’a geçmesi hala çok zordu. Yeni .Net Standard sürümüyle beraber bu durum değişti.

Bence .Net Standard 2.0'ın duyrulması en az .Net Core 2.0 kadar önemli ve daha çok insanı ilgilendiren bir konu. .Net Core 2.0, Asp.Net Core 2.0 ve Entity Framework 2.0'da, .Net Standard 2.0 standartlarına göre yazılmış, yani olayın kalbinde .Net Standard var. O yüzden .Net Standard’daki yeniliklerle başlamak istiyorum.

.Net Standard 2.0: Artık .Net Core’a geçmemek için bir mazeretimiz kalmadı

.Net Standard’ın ilk kez duyrulması .Net Core’la aynı tarihlere denk geliyor. Microsoft’un hedefi tek bir .Net Standard kütüphanesinde yazılmış kodun, farklı .Net Platform’larında (.Net Framework, .Net Core, Xamarin, Mono, Windows Phone vs.) çalışmasını sağlayıp, platformlar arası kod paylaşımını arttırabilmekti. 2.0'la beraber bu hedefe oldukça yaklaşılmış.

.Net Standard 2.0'la beraber eskiden 13K olan API sayısı 20K daha artarak 33K ya çıkmış durumda.

Böylelikle Windows Forms, WPF, WCF gibi Windows spesifik API’lar hariç büyük oranda .Net Framework Base Class Library’leri .Net Standard’a dahil edilmiş.

Nuget üzerindeki paketlerin %70'inden fazlası şuan .Net Standard 2.0'la uyumlu. Böylelikle bir .Net Core 2.0 uygulaması geliştirirken veya mevcut uygulamalarımızı .Net Core 2.0 taşırken bağımlı olduğumuz paketlerin çoğunda uyumluluk sorunu yaşanmayacak.

Getirdikleri en önemli yeniliklerden biri de mevcut .Net Framework kütüphanlerimizi .Net Standard 2.0'a yeniden compile etmeden, bir .Net Core 2.0 uygulamasında çalışmasının sağlanması olmuş. İzlediğim Microsoft demolarından birinde en son 2011 yılında versiyonu çıkmış bir Nuget paketini .Net Core 2.0 projesine ekleyip çalışmasını sağlıyorlardı. Tabi buradaki ön koşul mevcut kütüphanenin kullandığı API’ların .Net Standard 2.0 tarafından destekleniyor olması. Aynı şekilde bir .Net Standard 2.0 kütüphanesine .Net Framework kütüphanesi ekleyebiliyoruz. Böylelikle .Net Framework’le yazılmış kütüphanelerimizi Xamarin dahil birçok farklı .Net platformda kullanabilmemiz mümkün hale gelmiş.

Bu yazıyı yazarken hangi .Net Standard sürümünün hangi API’ları desteklediği bilgisini içeren bir API Referans dökümanı buldum. Buradan hangi versiyonun neleri desteklediğini inceleyebilirsiniz.

.Net Core 2.0: En hızlı .Net Platformu

.Net Core 2.0 şu ana kadar yapılmış en hızlı .Net Platformu olmuş. Böyle olmasınında community’nin yaptığı geliştirmelerin de önemli bir payı var. Özellikle bu sürümde Microsoft .Net Core ekibinin yanı sıra open source camiası da çok çalışmış ve performans geliştirmelerinde önemli katkıları olmuş. Yeri gelmişken Microsoft Github repository’lerindeki community’den gelen code review ve pull request artışlarından da bahsetmek istiyorum. 2014 yılında Microsoft’a gelen PR sayısı ortalama 500 civarındayken, bu rakam 2017 yılında 3000' civarına çıkmış. Bu .Net Core’un geliştirilmesinde community desteğinin ne kadar büyük yer tuttuğunu gösteriyordur sanırım.

.Net Core 2.0 geliştirilirken tamamen .Net Standard 2.0 standartlarında geliştirilmiş.

Yapılan benchmark’lara göre .Net Core 1.0’a göre yer yer %20 performans artışı sağlanmış.

Ama beni en çok şaşırtan .Net Framework 4.7 ile yapılan performans testleri oldu. Collections, LINQ, Compression, Cryptograpgy, Math, Serialization, Text Processing, File System, Networking ve Concurrency gibi konularda yapılan testlerde 2 ila 600 kat arası daha hızlı çalıştığı gözlemlenmiş. Test sonuçlarına buradan ulaşabilirsiniz.

En çok ilgilimi çeken olaylardan biri de Raygun.io adlı firmanın alt yapılarını Node.js’den .Net Core geçirerek sağladıkları %2000 performans artışı oldu. Tasarladıkları ürünün çok fazla background io işlemi yaptığını ve .Net Core’un bu tür işlerde Node.js’e göre çok daha hızlı olmasından dolayı bu performans artışını sağladıklarını söylüyorlar. Bu geçişi nasıl yaptıkları ve sonucunun neler olduğuna dair güzel bir makaleleri var.

.Net Core 2.0'ın altı yeni platformda çalışması sağlanmış. Bunlara Debian Stretch, SUSE Linux Enterprise Server 12 SP2 ve macOS High Sierra da dahil. Ayrıca generic linux paketleri compile etmemize de imkan sağlamışlar. Hatta Raspberry Pi için .Net Core’un ARM32 Runtime’ını da yapmış olmaları çok güzel bir gelişme.

Kısacası bu sürümde çok çalışmışlar :)

Asp.Net Core 2.0

Asp.Net tarafında da önemli performans geliştirmeleri söz konusu. Yine bir önceki sürümden %20 daha hızlı olduğu söyleniyor. TechEmpower benchmark’larında da görüldüğü üzere Asp.Net Core en hızlı Web Framework’leri arasında.

Aspnet.Core.All adında hayatımızı kolaylaştıracak bir paket çıkartmışlar. Bu paket içerisinde, bir Asp.Net Core 2.0 uygulamasının ihtiyacı olan bütün bağımlılıklar mevcut. Bu şekilde deployment’ı ve güncellemeyi kolaylaştırmışlar.

Startup.cs ve Program.cs deki kod kalabalığını oldukça azaltmışlar, bazı ayarları default’a taşımışlar. Örneğin artık UseKestrel, UseIISIntegreation, Logging gibi ayarları belirtmeden de uygulamanızı çalıştırabiliyorsunuz.

Benim en garibime giden MVC tarafında yaptıkları geliştirmeler oldu. Hızla Angular, React gibi yapılara geçildiği bu günlerde bana biraz gereksiz bir efor gibi geldi.

Razor’a C# 7.2 desteği gelmiş. Ayrıca artık deploy esnasında Razor sayfaları pre-compile ediliyor. Böylece MVC uygulamalarının başlama hızı arttırılmış.

Ayrıca MVC’ye alternatif olarak RazorPages diye bir yapı getirmişler. MVC’nin bazı işler için çok kalabalık ve ağır yapı olduğunu düşünüp yine Razor template’leri üzerine daha hafif bir yapı geliştirmişler. Bu yeni yapı bana WebForms günlerini hatırlattı. Çünkü bir cshtml dosyası bir de onun code behind dosyası var. Bu dosya içerisinde cshtml ile ilgili back-end işlerini yürütmeniz için PageModel’den türetilmiş bir sınıf var. OnGet, OnPost gibi metodlarda MVC Action’larına benzer işler yapabiliyorsunuz. Hızlıca basit form sayfaları yapmanıza imkan sağlanmış. Ama ben neden 2017 yılında hala böyle bir yapıya emek harcandığını anlayabilmiş değilim.

Visual Studio 2017 15.3 ve Visual Studio For Mac

15.3 versiyonuyla beraber .Net Core 2.0, Net Standard 2.0 ve Asp.Net Core 2.0 için tooling desteğini çok geliştirmişler. Debug ederken ve Framework değiştirirken yaşadığımız hatalar giderilmiş. .Net Standard kütüphanesi yazmak çok daha kolay hale gelmiş. Ve .Net Core 2.0 evreninde yapılan geliştirmelerin hepsi Visual Studio For Mac içinde yapılmış.

Resharper’dan arakladıkları özellikleri geliştirmişler. Live Unit Testing ve Coverage özelliği getirmişler ki bence çok güzel bir yenilik olmuş. Artık Visual Studio siz kodunuzu yazarken, canlı olarak Unit Test’lerin geçip geçmediğini ve kodun ne kadarını cover ettiğinizi gösteriyor.

Jetbrains demişken onlar da Visual Studio’nun alternatifi Rider adında çok güzel bir IDE çıkarttılar.

Serverless Architecture hakkında yazdığım yazımda Amazon’un AWS Lambda için oldukça güzel bir toolkit geliştirdiğinden bahsetmiştim. Microsoft sonunda aynısını Azure Functions için de geliştirmiş ve Visual Studio’ya 15.3 sürümüyle beraber eklemiş. İzlediğim demolarda kullanımı oldukça kolay ve yetenekli bir toolkit geliştirdiklerine şahit oldum. Sanırım önümüzdeki günlerde Azure Functions’la ilgili daha fazla haber duyacağız.

Benim sevdiğim yeniliklerden biri de Visual Studio’ya Angular ve React/Redux uygulamaları için .Net Core back-end’li proje template’leri eklemeleri olmuş. Yeni proje template’leri bu UI Framework’lerinde çok fazla tecrübesi olmayanlar için yararlı olabilir diye düşünüyorum.

Bütün bu yenilikler haricinde daha çok Visual Studio’nun Azure tarafıyla olan entegrasyonu geliştirmişler.

Entity Framework Core 2.0

Öncelikle güzel bir gelişme olarak yeni Entity Framework .Net Standard 2.0 standartlarında yazıldığı için, .Net Core’un yanı sıra .Net Framework ve Xamarin’de de çalışabiliyor.

Entity Framework tarafındaki yenilikler açıkçası beni çok heyecanlandırmadı. Microsoft .Net dünyasında Entity Framework’ü yıllardır standart Data Access Framework’ü haline getirmeye çalışıyor. Ama oldukça fazla başarılı alternatifi var bunlara Dapper, PetaPoco gibi MicroORM’ler de dahil. Standart haline getirmekte ne kadar başarılı olurlar emin değilim. Özellikle No Sql’lerin bu kadar yaygınlaştığı ve insanların data access için daha hafif yapıları tercih ettiği bu günlerde.

Query üretimi ve performans konusunda güzel geliştirmeler yaptıklarını söyleyebilirim. Özellikle Context Pools benim hoşuma gitti. Context’lerin yaratılması eskiden beri maliyetli bir olaydı ve insanlar genelde bir Web uygulamasında gelen her request’de yeni bir Context yaratıyorlardı. Context yaratımını akıllı cache mekanizmalarıyla daha az maliyetli hale getirmişler. Context Pools yapısıyla beraber her seferinde aynı Context’i defalarca yaratmanıza gerek kalmıyor. Bu yapıyı da Asp.Net Core’un DI yapısıyla uyumlu yapmışlar. Ama bu özellikliğin Context’in state’ini sizin yönettiğiniz senaryolarda kullanılması sakıncalı. Context’in shared olduğu aklınızda bulunsun.

Table Splitting diye güzel bir yenilik getirmişler. ORM’lerdeki en büyük sıkıntılardan biri select query’lerinin default olarak *’la gelmesi ve her tablonun tek bir Entity’e map edilmesiydi. Elbetteki Select kısmını özelleştirip AutoMapper gibi yapılarla bunu çözebiliyorduk ama artık birden fazla Entity’i aynı tabloya map etmemize imkan tanınmış.

Yine hoşuma giden ve niye daha önceden yapmadıklarını anlayamadığım yeniliklerden biri de String.Format ve String Interpolation kullanarak yazdığınız sorguların otomatik olarak Sql Parameter’lı sorguya çevirilmesi olmuş. Örneğin ;

Yukarıdaki gibi bir sorgu yazdığımızda city değişken üretilen sorguya aşağıdaki gibi parametre olarak eklenecektir.

SELECT * FROM Customers WHERE City = @ p0

Sonuç

.Net Core 2.0 sürümü, benim gibi yıllardır .Net Platformunda uygulama geliştiren developer’lar için yeni imkanlar sağlıyor. Ben önümüzdeki yıllarda .Net Developer’ların mevcut .Net uygulamalarını Core’a geçirip hızlıca Linux dünyasına kayacaklarını, aynı şekilde yıllardır Linux ortamında geliştirme yapan developer’ların da Microsoft ön yargısını kırıp .Net Core’u deneyeceklerine ve kullanmaya başlayacaklarını düşünüyorum.

Bu yeni sürümüyle .Net hiç olmadığı kadar performanslı ve güvenilir.

Artık arkasında sadece Microsoft değil Open-Source camiası da var ve bundan sonra gideceği yönü de developer’lar belirleyecek gibi duruyor.

.Net Core 2.1'in geliştirmelerine çoktan başlandı ve 2018 başında çıkması planlanıyor. .Net Core tarafında bundan sonra geliştirmelerin daha hızlı ve dinamik olacağını düşünüyorum. Çünkü bu sürümle beraber önemli bir bariyer aşıldı.

Bir sonraki yazımda görüşünceye kadar hepinize iyilikler dilerim.