BasicCRUD · Katmanlı Kullanıcı Yönetimi API Örneği
Generic servis/repository, AutoMapper DTO dönüşümü, AsNoTracking okumaları, Skip/Take sayfalama ve ortak yanıt modeli içeren katmanlı kullanıcı API’si.
BasicCRUD, ASP.NET Core ve .NET 8 ile yazılmış bir kullanıcı kayıt API’si. Kullanıcı ekleme, okuma, güncelleme ve silme işlemlerinin HTTP isteğinden SQL Server’a kadar nasıl ilerlediğini tek bir örnek üzerinden gösteriyor. Aynı akışta istemciye dönen veri biçimi, veritabanı işlemleri ve hata kayıtları da ayrı yerlerde ele alınıyor.
Bir kullanıcı güncellemesinin izlediği yol
UsersController, PUT /api/users/{id} isteği geldiğinde önce kaydı kimliğiyle arıyor. Kayıt bulunursa AutoMapper, UpdateUserDto içindeki ad, soyad, yaş ve cinsiyet alanlarını mevcut kullanıcı nesnesine aktarıyor. Denetleyici, güncellemeyi IGenericService<User> üzerinden repository’ye iletiyor. Repository, Entity Framework Core ile değişiklikleri SQL Server’a yazıyor. Başarılı yanıtta kaydın güncel alanları UserDto olarak dönüyor. Aranan kimlik bulunamadığında ise istemci 404 Not Found alıyor.
UserProfile, oluşturma isteğinden, güncelleme isteğinden ve veritabanı modelinden yapılan eşlemeleri bir araya getiriyor. Üç DTO bugün aynı profil alanlarını taşısa da ayrı tipler olarak tanımlanmış. Böylece giriş ve çıkış sözleşmelerinin hangi işlemde kullanıldığı, yalnızca metodun imzasına bakarak anlaşılabiliyor.
Kullanıcı listesi ve HTTP yanıtları
Bir yönetim ekranını düşünelim. İlk görünümde on kullanıcı göstermek için ekran GET /api/users/paginated?page=1&pageSize=10 isteği gönderebilir. Repository bu sorguda AsNoTracking, Skip ve Take kullanıyor. Yanıt, sayfadaki kayıtları taşıyor. Toplam kayıt sayısı için ayrı bir alan ve sayfalama sorgusunda açık bir sıralama ölçütü, bu örneğin kapsamı dışında kalıyor.
Denetleyici farklı işlemler için farklı HTTP durumları kullanıyor. Kayıt oluşturma işlemi 201 Created ve yeni kaydın adresini, silme işlemi 204 No Content döndürüyor. Gövdesi olan liste, detay ve güncelleme yanıtlarında ResponseModel<T> üzerinden başarı durumu, mesaj ve veri taşınabiliyor. Bu ayrım, istemcinin bir kaydın oluşturulduğunu veya silindiğini yanıt metnine bakmadan anlamasını sağlıyor.
Katmanlar ve hata kaydı
Api projesi HTTP trafiğini karşılıyor, Application içindeki GenericService<T> çağrıları veri erişimine iletiyor. Domain kullanıcı modelini ve DTO’ları, Infrastructure EF Core bağlamını ve generic repository’yi, Shared ise ortak yanıt tipini barındırıyor. Generic servis ve repository, bağımlılık enjeksiyonuna istek kapsamıyla kaydediliyor. Örnekte servis katmanının rolü çağrıyı iletmekle sınırlı. Kaynak kodu okurken bu sayede HTTP kararlarıyla veritabanına yazan kodun nerede ayrıldığını adım adım takip etmek mümkün.
Geliştirme ortamında Swagger arayüzü uç noktaları denemeye açıyor. Beklenmeyen bir hata oluştuğunda denetleyici istemciye genel bir 500 yanıtı verirken istisnayı Serilog ile kaydediyor. Hata düzeyindeki kayıtlar konsola ve günlük olarak dönen bir dosyaya yazılıyor. Örneğin bir güncelleme sırasında veritabanı çağrısı başarısız olursa istemciye verilen kısa mesaj ile geliştiricinin inceleyeceği istisna kaydı ayrı kalıyor.