.Net Core geçişinde neler yaşadık?

Anıl Güleroğlu
BilgeAdam Teknoloji

--

02.11.2019 tarihinde düzenlenen dotnetkonf19 etkinliğinde gerçekleştirdiğim sunuma buradan ulaşabilirsiniz.

2015 yılında .Net Core diye bir teknolojinin geleceğini duyduğumuzda heyecanlandık ve ilk çıktığında testlerimize başladık. Zor bir karar verme sürecinden sonra 2016 yılında küçük projeler ile geçişe başladık. Bu süreçte çok farklı lokasyon, müşteriler, isterler ve ekipler ile geliştirilen uygulamalar da bu geçişi uyguladık. Geçişe .Net Core RC-1 iken başladığımız için ihtiyacımız olan paketleri bulamadık ya da port edemedik. Bunun için API’ler geliştirip, Mikro Servis yapıya geçmek zorunda kaldık. Ayrıca hayat kurtaran bir sürü helper proje geliştirdik.

Bu süreçlerin hepsi bize tahmin ettiğimizden çok daha fazla şey öğretti. Dağınık ve farklı projelerde çalışan ekipler ile böyle bir yapının geliştirilmesi sürecinde bakım, versiyonlama ve geliştirme süreçlerinin bu kadar zor olabileceğini tahmin etmemiştik. Tabiki burada zamana karşı yarış en büyük mücadelemiz oldu.

Bu geçişte neler kazandık?

Open Source

.Net Core’un Open Source olması bizim işimize çok yaradı. Hem eksik paketlerin hızlıca ortaya çıkmasında hem de daha stabil olarak çalışan yapıların hayatımıza gelmesine imkan sağladı. Terra içinde bir Html Helper’lardan oluşan bir UI Kit oluşturduk. Bu süreçte ilk referansımız dotnet repository’si oldu.

Cross Platform

.Net ile geliştirilen uygulamanın Mac ve Linux üzerinde çalıştırılması çok keyifli oluyor. Bu süreç ile beraber hayatımıza Linux girdi ve IIS olmadan uygulama yayınlamak için yeni şeyler öğrendik. Özellik Windows bağımlılığından kurtulup Linux üzerinde çalışan uygulamalar geliştirebilmek, server maliyetleri konusunda tasarruf sağladı. Bir developer olarak Macbookta .net geliştirme keyfine eriştim :)

Performans

.Net Core içinde bir çok yapıyı baştan kurgulayarak ciddi performans artışı elde edildi. Ortalama olarak geçiş yapılan projelerde yaklaşık 2 kata kadar bir performans artışı yaşadık. .Net Core 3 ile beraber yapılan iyileştirmeler ile artık bu performans artışını daha da fazla hissedeceğiz.

Cloud ve Mikro Servisler

.Net Core ile birlikte geliştirilen uygulamalar Cloud üzerinde çalışmaya daha uygun halde geliyorlar. Özellikle eklenen enviroment gibi özellikler cloud için hayat kurtarıyor. Ayrıca da Mikro Servis geliştirmek için framework’e bir sürü özellik eklendi. .Net Core 3 ile gelen gRPC, özellikle mikro servisler için çok uygun ve başarılı bir protokol. .Net Core tarafında wcf yerine bir alternatif gelmeyecek ve artık bu konuda gRPC’yi öneriliyor.

Javascript Servisleri ve SPA Templateleri

.Net Core içerisinde node.js ile geliştirilmiş paketleri çalıştırabiliyorsunuz. Bu da ciddi anlamda esneklik yaratabiliyor. Özellikle SPA geliştirme konusunda bize çok kolaylık sağlıyor. Kendi içerisinde gelen Angular, React gibi template’ler ile SPA uygulamalar geliştirip hızlıca deploy etmenize imkan sağlıyor.

Değişen yapılar neler?

Geçişi özellikle Client Side, Server Side gibi farklı başlıklarla incelemek istiyorum. Hali hazırda zaten SPA kullananlar için Client Side bölümünü direk geçebilir.

Client Side

Client Side tarafındaki geçiş Server Side’a göre daha kolay oluyor. Çünkü çoğu özellik halen daha framework içerisinde devam ediyor.

libman : MVC kullanırkan client side’daki paketlerimizi yönetmek için nuget kullanırken, artık client side paket yönetiminde karşımıza libman çıkıyor. İlk versiyonlarda bower ile bu işlemi yaparken 2.2 ile bu işi libman’a bıraktılar.

@helper: helper metodları artık yok. Onların yerine Func<> ya da functions yapılarını kullanıp cshtml’ler içinde metod geliştmemiz gerekiyor.

Child Action: Razor içinde başka bir action’ı artık çağıramıyoruz. Bunun yerine ViewComponent yapısı geldi. ViewComponent’ler ile daha modular uygulama geliştirmek mümkün oluyor.

Bundling ve Minification: MVC’de kullandığımız bundle yapısı artık yok. Microsoft RunTime Bundle önermiyor artık ve Pre Build anında bundle işlemini öneriyor. Bunun içinde bundle.config dosyası içinde ayarları yapmamız gerekiyor. Bu işlem için grunt gibi yapıları da kullanabiliriz.

Server Side

Server Side tarafında değişikler çok fazla, mevcut MVC uygulamaların geçişlerinde bu aşamada özellikle dikkat edilmesi gerekiyor.

Paket Uyuşmazlıkları : .Net Core geçişi ile birlikte çok erken geçen bir ekip olara ciddi anlamda paket bulamayıp alternatif çözümler denemek zorunda kaldık. Şu anda bu durum daha kolay aşılabilir ama yine de geçiş öncesinde paket uyumluluklarının kontrol edilmesi gerekiyor. .NET Portability Analyzer bu konuda çok yardımcı olabilir.

Web Api ve MVC : Artık bu ayrım yok, her endpoint web api olarak geliştiriliyor. Geri dönüş değerine göre davranışı değişiyor.

HttpHandler & HttpModule : Bu iki yapı artık yok. Bunların yerine Middleware ve yeni Http Request Pipeline geldi. Filter’da .Net Core içerisinde bulunuyor ama sadece controller’lar üzerine gelen request’leri karşılabildikleri için, middleware’ler kadar geniş kullanımları yok. Ayrıca artık HttpContext’e heryerden erişemiyoruz. Servislerimiz içinden erişebilmemiz için IHttpContextAccessor yapısını kullanmamız lazım.

EF.Core : Entity Framework için uçtan uca baştan geliştirmeye gittiler ve bir sürü özelliği değiştirdiler. Ciddi anlamda performans artışı sağlandı. Çok işlevsel yeni özellikler eklendi. EF6 ve EF.Core’un detaylı karşılaştırmasına buradan ulaşabilirsiniz.

Localization : Yeni gelen localization özellikleri ile artık .resx dosyaları olmadan da varsayılan olarak gelen yapı ile localization yapabileceğiz. Bir kaç tanımlama ile birlikte hangi data source’dan istersek bu özelliği kullanabileceğiz.

Development & Debugging & Publishing

VSCode : Artık Visual Studio olmadan da geliştirme yapabileceğiz. IDE olarak bazı özellikleri kayıp etsek de, genel olarak daha lightweight bir editor ile kod geliştirme imkanı yakalıyoruz.

Dotnet Watch : Bu yeni özellik ile artık uygulama çalışırken kodları değiştirebileceğiz. Bu özellik bize geliştirme anında ciddi zaman tasarrufu kazandırıyor. Detaylı bilgiye buradan ulaşabilirsiniz.

Self Host : Uygulamaları artık server uygulaması olmadan da çalıştırabileceğiz. IIS ihtiyacımız kalmadı. Ayrıca daha az kaynak tüketen kestrel ile uygulamalarız çalışabilecek. Son versiyonlar ile beraber de .Net Core uygulamalarımızı servis olarak çalıştırabileceğiz.

Peki .Net Core’a Geçmeli miyiz?

Bu sorunun aslında net bir cevabı olduğuna inanmıyorum. Mevcuttaki projenin geliştirme ortamı ve bağımlılıkları burada en önemli konu durumunda. Eğer projenin windows bağımlılığı yoksa ve kullanılan paketler geçiş için uygunsa kolay bir şekilde geçiş sağlanabilir. Bu konularda sıkıntı varsa eğer, geçiş ciddi anlamda karın ağrıtabilir.

Ayrıca yeni başlanacak projelerde .Net Core kullanmak bir tercih olabilir. Bu da değerlendirilmesi gereken bir konu.

Son Olarak

Biz .Net Core geçişini hem uygulama özelinde hem de yeni başlanan projelerde gerçekleştirdik. Bu geçiş bazı durumlarda bizim ciddi vaktimizi aldı ama genel olarak geçişin sonuçları bizi memnun etti.

--

--