Neden Her Projede Arka Planda .NET ve C# Var
Yedi farklı projede aynı dil, yedi farklı problem.
Mert Celal Yılmaz · Full Stack Developer · Güncellendi:
.NET, Microsoft'un geliştirdiği açık kaynaklı bir çatı; C# ise bu çatının üzerinde çalışan ana dil. İkisi birlikte bir API'yi ayağa kaldırmak, veritabanına bağlanmak, iş kurallarını yazmak için ihtiyacın olan hemen her şeyi sağlıyor. .NET 9 ile performans tarafında da ciddi kazanımlar var; aynı kod artık daha az kaynakla daha hızlı çalışıyor.
ARCA Yazılım'da Temmuz 2025'ten beri backend tarafında .NET 9 ve ASP.NET Core kullanıyorum. Çoğunlukla çok kiracılı (multi-tenant) API'ler yazıyorum: tek bir kod tabanı, birden fazla müşteri, her biri kendi verisini görüyor. Yeniden kullanılabilir REST servisleri kurmak da işin büyük kısmı; aynı servisi her projede sıfırdan yazmak yerine ortak bir yapı üzerinden ilerliyorum.
Şu an elimden geçen projelerin neredeyse tamamında backend dili .NET: YODER bağış platformu, bir otel zincirinin AI destekli rezervasyon çağrı asistanı, bir apartman yönetim sistemi, kurumsal bir iş yönetim platformu, bulut tabanlı bir doküman yönetim sistemi, çok kiracılı bir personel taşıma ve filo optimizasyon platformu ve kişisel projem Harfsayı'nın .NET 10 üzerinde çalışan oyun sunucusu. Farklı sektörler, farklı problemler ama arka planda hep aynı dil var.
Bu kadar çeşitli işte aynı araçla ilerleyebilmek, aslında dilin kendisinden çok onun etrafında kurduğun alışkanlıklarla ilgili.
ASP.NET Core'un middleware pipeline'ı ile dependency injection container'ı bir arada çalışınca çok kiracılı yapı kod tekrarı olmadan çözülüyor. İstek geldiğinde bir middleware header'dan ya da subdomain'den hangi tenant'a ait olduğunu çözüyor, sonrasında DI container o request scope'u içinde tenant'a özel connection string'i ya da servis örneğini enjekte ediyor. Yani her handler'ın içine 'if tenant == X' yazmak yerine, tenant çözümlemesi framework seviyesinde ve tek bir yerde yapılıyor.
Async/await konusunda en sık karşılaşılan yanlış anlama, onu sadece 'daha hızlı çalıştırır' gibi görmek. Asıl kazanç, bir I/O işlemi (veritabanı sorgusu, dış servis çağrısı) beklenirken thread'i boşta tutmamak; yani CPU'yu değil thread havuzunu koruyor. Bunu yarım yamalak kurup senkron bir metodun içinden .Result ya da .Wait() ile async bir çağrıyı beklersen bazı context'lerde deadlock'la karşılaşabilirsin, bu yüzden 'async all the way' kuralına çağrı zincirinin sonuna kadar uymak gerekiyor.