ASP.NET Geliştiricileri için Temel Bilgiler

ASP.NET Core, modern web uygulamaları geliştirmek için mükemmel bir platform sunar. Ancak, güçlü ve sürdürülebilir bir yazılım geliştirmek için bazı best practice yöntemlerini takip etmek çok önemlidir. Bu yazıda, ASP.NET Core ve C# dilinde uygulayabileceğiniz en önemli best practice yöntemlerini inceleyeceğiz.

1.       HTTP Metod Seçimi

Her HTTP metodu belirli bir amaç için tasarlanmıştır. Doğru metod seçimi, API'nin kullanılabilirliğini ve anlaşılabilirliğini artırır.

GET: Veri almak için kullanılır.

POST: Sunucu üzerinde bir kaynak oluşturmak veya güncellemek için kullanılır.

PUT: Sunucuda bir kaynağı tamamen güncellemek için kullanılır.

PATCH: Bir kaynağın parçasını güncellemek için kullanılır.

DELETE: Sunucudan bir kaynağı silmek için kullanılır.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği

2.       Doğru HTTP Cevap Durum Kodları

Her API yanıtı, durumunu belirten doğru HTTP durum kodu ile birlikte dönmelidir.

200 OK: Başarılı bir GET, PUT, PATCH veya DELETE isteği için kullanılır.

201 Created: Başarılı bir POST isteği için kullanılır.

204 No Content: Başarılı ama içerik döndürmeyen bir DELETE isteği için kullanılır.

400 Bad Request: Yanlış format veya parametre içeren istekler için kullanılır.

401 Unauthorized: Kimlik doğrulama gerektiren isteklere yanıt verir.

404 Not Found: İstenen kaynak bulunamadığında kullanılır.

500 Internal Server Error: Sunucu hatası durumunda kullanılır.

3.       Endpoint URL Tasarımı

Endpoint URL'leri kullanıcı dostu ve açıklayıcı olmalıdır. API'nin amacı ve kullanımı hakkında net bilgi vermelidir.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği:

4.       Request İçinde Aynı Property Almaktan Kaçınma

API tasarımında, gereksiz tekrarlardan kaçınılmalıdır. Aynı propertyleri birden fazla kez almak, hem veri kirliliği yaratır hem de API'nin karmaşıklığını artırır.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği:

5.       Startup.cs Dosyasını Sade Tutmak

ASP.NET Core uygulamalarında Startup.cs dosyası, uygulamanın başlangıç yapılandırmalarını içerir. Bu dosya gereksiz yüklemelerden ve karmaşıklıktan arındırılmalı, yalnızca gerekli konfigürasyonlar bu dosyada tutulmalıdır.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği:

6.       Projeyi Küçük Parçalara Bölme

Projeyi, fonksiyonel birimlere ayırmak, kodun sürdürülebilirliğini ve yönetimini kolaylaştırır. Modüler yapı, yeniden kullanılabilirliği artırır ve hata ayıklamayı kolaylaştırır.

Yanlış Kullanım Örneği:

Tek bir projede, tüm iş mantığı, veri erişim ve kullanıcı arayüzü kodlarının bulunması.

Doğru Kullanım Örneği:

·  MySite.Web => web uygulaması

·  MySite.API => api uygulaması

·  MySite.Core => class library

·  MySite.Data => class library

·  MySite.Service => class library

·  MySite.Logging => class library

 

Bu 3 katman genellikle Core Katmanı, Repository Katmanı ve Service Katmanı olarak adlandırılır. Şimdi bu katmanları detaylı bir şekilde inceleyelim:

1. Core Katmanı: Core katmanı en içteki katmandır ve genellikle aşağıdaki unsurları içerir:

  • Modeller: Uygulamanın genelinde kullanılacak veri yapıları.
  • DTO (Data Transfer Object) Nesneleri: Tüm katmanlarda kullanılan veri transfer nesneleri.
  • Interfaceler: Repository ve Service katmanlarının implementasyonunda kullanılan arayüzler. Ayrıca, Unit of Work tasarım desenine uygun interfaceler de burada bulunur.

Core katmanında sadece tanımlayıcı unsurlar bulunur. Diğer katmanlar, Core katmanındaki interfacelere göre işlerini gerçekleştirir.

2. Repository Katmanı: Repository katmanı veri erişim işlemlerini yönetir ve genellikle şunları içerir:

  • Migration Dosyaları: Veritabanı şemasıyla ilgili değişikliklerin izlenmesini sağlar.
  • Sync Dosyaları: Veritabanına başlangıç verilerini ekler.
  • Interfacelerin Implementasyonları: Core katmanındaki arayüzlerin uygulanmış halleri. Repository katmanı sadece veri erişim işlemleri ile ilgilenir.

Repository katmanı, Core katmanına referans alır. Her biri birer class library olarak düşünülür ve Repository class library, Core class library'ye referans verir.

3. Service Katmanı: Service katmanı iş mantığını içerir ve aşağıdaki bileşenleri barındırır:

  • Business Logic: İş kurallarını ve algoritmaları içerir.
  • Mapping: DTO ve Entity nesneleri arasında dönüşüm işlemlerini yönetir.
  • Validation: Verilerin doğruluğunu kontrol eden kodları içerir.
  • Exception Handling: Hataları yönetir ve iş mantığıyla ilgili diğer operasyonları yürütür.

Service katmanı, hem Repository hem de Core katmanlarını referans alır ve uygulama mantığını bu katmanlar aracılığıyla gerçekleştirir.

Ekstra Katmanlar: Gelişmiş mimarilerde ek katmanlar eklenebilir, örneğin:

  • Logging Katmanı: Uygulama işlemlerinin kaydedilmesini sağlar.
  • Caching Katmanı: Veri önbellekleme işlemlerini yönetir.

Bu ekstra katmanlar, uygulamanın performansını artırmak ve kodun düzenini korumak için kullanılabilir.

Mimari Kullanım Senaryoları: Bu 3 katmanlı mimari, hem API uygulamaları hem de MVC web uygulamaları için uygulanabilir. API uygulamalarında, sadece servis katmanı kullanılır ve web uygulamaları API ile etkileşimde bulunur.

Ek olarak, cache katmanı gibi bir dördüncü katman da eklenebilir. Bu katman, veri önbellekleme işlemlerini yönetir ve uygulamanın performansını artırır. 

7.       Controller Sınıflarını ve Action Metodlarını Temiz Tutma

Controller sınıfları, yalnızca ilgili iş mantığını barındırmalı ve gereksiz kodlardan arındırılmalıdır. Action metodları kısa ve tek sorumluluk ilkesine uygun olmalıdır.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği:

8.       Temiz Kod Prensiplerini Uygulama

Kodun okunabilir, anlaşılır ve bakımının kolay olması için temiz kod prensiplerine dikkat edilmelidir. Kodlama standartlarına uygunluk, anlamlı değişken ve metod isimleri, tekrar eden kodun minimize edilmesi önemlidir.

Yanlış Kullanım Örneği:

Doğru Kullanım Örneği:

1.       Hataları Global Olarak Ele Alma

Uygulama genelinde hata yönetimi için Middleware kullanarak global bir hata yakalama mekanizması oluşturmak en iyi yöntemdir. Bu, uygulamanızın beklenmedik hatalara karşı daha dayanıklı olmasını sağlar.

 

2.       Tekrar Eden Koddan Kaçınma

Kodun tekrar eden parçaları, ayrı metodlar veya sınıflar halinde yeniden kullanılabilir hale getirilmelidir.

3.       Action Metodları Direkt Olarak Model Sınıflarında Dönmeme

API endpointleri, direkt olarak veri modeli döndürmek yerine, DTO (Data Transfer Object) kullanmalıdır. Bu, veri güvenliği ve API'nin dışa bağımlılığını azaltmak açısından önemlidir.

 

4.       Data Acces Layer Optimize Et

Veri Erişim Katmanı (DAL), bir .NET Core programının kritik bir bileşenidir ve veritabanı ile uygulama arasındaki iletişimi yönetir. DAL, iş mantığı katmanını veri depolama katmanından ayırır ve veri güncelleme ve sorgulama için bir arayüz sağlar.

 

Veri erişim katmanını optimize etmek için:

·       Veritabanından veri almak için asenkron API yöntemlerini kullanın.

·       Entity Framework Core veya başka uygun bir ORM kullanarak verimli veri alma.

·       İyi tasarlanmış SQL sorguları oluşturun, indeksleri kullanın ve veri alımını minimize edin.

·       Connection pooling özelliğini etkinleştirerek veritabanı bağlantılarını verimli bir şekilde yönetin.

·       SELECT * kullanmaktan kaçının ve yalnızca gerekli olan sütunları seçin.

·       Veri modellerini akıllıca tasarlayarak gereksiz verileri ve join'leri minimize edin.

·       LINQ sorgularını kullanarak verileri toplamak ve filtrelemek

·       Küçük veri setleri ve basit işlemler: LINQ tercih edilebilir çünkü kodun daha temiz ve okunabilir olmasını sağlar.

·       Büyük veri setleri ve karmaşık sorgular: SQL sorguları tercih edilmelidir çünkü performans avantajı sağlar ve daha optimize edilebilir.

 

5.       Asenkron Programlamayı Kullanın

.NET Core'da asenkron programlama, görevlerin bloklanmadan yürütülmesine olanak tanır. async ve await anahtar kelimelerini kullanarak, ağ çağrıları veya veritabanı sorguları gibi I/O-bağımlı işlemler için verimliliği artırabilir, yanıt verebilirliği ve performansı iyileştirebilirsiniz.

 

6.       Caching Tekniklerini Kullanın

Caching, uygulamaların yanıt verebilirliğini ve performansını artırmaya yardımcı olabilecek önemli bir tekniktir. .NET Core'da caching türleri:

In-Memory Caching: Verileri uygulamanın belleğinde saklar.

Distributed Caching: Birden fazla uygulama örneği arasında cache'lenmiş verileri paylaşır.

Response Caching: HTTP yanıtlarını sunucu veya proxy seviyesinde cache'ler.

7.       Content Delivery Network (CDN) Kullanın

CDN, web içeriğini depolayan ve kullanıcıya en yakın sunucudan teslim eden coğrafi olarak dağıtılmış bir sunucu ağıdır. CDN kullanımı, içerik teslimatını optimize eder, gecikmeleri azaltır ve web uygulamalarının performansını artırır.

8.       Compression'ı Etkinleştirin

Yanıt boyutunu küçülterek, ASP.NET Core'un yanıt sıkıştırma özelliklerinden yararlanabilirsiniz. En yaygın kullanılan sıkıştırma algoritmaları GZip ve Deflate'dir.

Yanıt sıkıştırma, ağ trafiğini azaltarak sayfa yükleme sürelerini iyileştirir ve bant genişliği kullanımını optimize eder.

Nasıl Çalışır?

  1. Sıkıştırma Algoritmaları:
    • GZip: En yaygın kullanılan sıkıştırma algoritmalarından biridir. Metin tabanlı dosyalar (HTML, CSS, JS) üzerinde yüksek sıkıştırma oranları sunar.
    • Deflate: GZip'e benzer bir algoritmadır ancak GZip'ten daha eski ve biraz daha az verimli olabilir.
  2. İstemci ve Sunucu Arasındaki İletişim:
    • İstemci (genellikle tarayıcı), sunucuya yaptığı her istek ile birlikte "Accept-Encoding" başlığını gönderir. Bu başlık, istemcinin desteklediği sıkıştırma algoritmalarını belirtir (örneğin, Accept-Encoding: gzip, deflate).
    • Sunucu, bu başlığa bakar ve desteklediği bir sıkıştırma algoritması varsa yanıtı sıkıştırır.
    • İstemci, sıkıştırılmış yanıtı alır ve bunu açar (decompress) ve böylece yanıtın orijinal içeriğine erişir.

 

  1. ASP.NET Core'da Yanıt Sıkıştırmayı Etkinleştirme:
    • Yanıt sıkıştırmayı ASP.NET Core uygulamanızda etkinleştirmek için Microsoft.AspNetCore.ResponseCompression paketini kullanabilirsiniz.
    • Startup.cs dosyasında yanıt sıkıştırmayı ekleyebilirsiniz.

4.       Yanıt Sıkıştırmanın Avantajları:

  • Daha Hızlı Yükleme Süreleri: Yanıtlar daha küçük boyutlu olduğundan, istemciye daha hızlı bir şekilde iletilir.
  • Daha Az Bant Genişliği Kullanımı: Sıkıştırma, özellikle mobil cihazlar veya düşük bant genişliğine sahip bağlantılar için faydalıdır.
  • Sunucu Kaynaklarının Daha Verimli Kullanımı: Küçük yanıtlar, sunucu ve istemci arasındaki veri transferini azaltır.

                Dikkat Edilmesi Gerekenler:

  • Tüm içerik türleri için sıkıştırma faydalı olmayabilir. Örneğin, zaten sıkıştırılmış olan dosyalar (örneğin, .jpg, .png gibi görüntü dosyaları) sıkıştırıldığında boyutlarında fark edilebilir bir azalma olmaz.
  • Yanıt sıkıştırma CPU kullanımını artırabilir, bu nedenle bu özellik kullanılırken performans izlenmelidir.

9.       Dependency Injection'ı Kullanın

Dependency injection, test edilebilirlik, sürdürülebilirlik ve loose coupling'i destekleyen bir tekniktir. .NET Core, yerleşik dependency injection desteği sunar.

10.   Boilerplate Kodu Önleyin

AutoMapper kullanarak, view model ve domain model mapping işlemlerini otomatikleştirin. Bu, kodunuzu daha net ve okunabilir hale getirir.

 

19. JWT Kullanarak Güvenliği Sağlayın

.NET Core'da güvenli kimlik doğrulama ve yetkilendirme için JWT (JSON Web Tokens) kullanın. Bu, güvenli bir uygulama geliştirme sürecinde önemli bir adımdır.

 

 

 

20.Environment Based Setting Kullanımı

Uygulamanızı geliştirirken geliştirme ortamını, yayına alırken production ortamını kullanın. Farklı ortamlarda ayarların yönetimi için yapılandırma dosyalarını kullanın.

21.Bundling ve Minification

CSS ve JavaScript dosyalarının boyutunu ve isteğini azaltarak web uygulamalarının performansını optimize edin. Bundling ve minification, HTTP isteklerinin sayısını azaltır ve daha hızlı indirme sürelerine yol açar.

Sonuç: Kodlama yaparken, yeni özellikler eklediğinizde mevcut yapının bozulmaması için minumum satırlık değişikliklerle aktif hale getirme veya pasif hale getirme işlemi yapılmalıdır. Bu, düzgün bir kodlama ile mümkün olur ve uygulamanın gelişimine kolayca uyum sağlar.

 

ZEYNEP SULTAN EROĞLU