Şimdi bu Dapper olayı var ya, tam bir muamma gibi gelebilir ilk başta. Hani böyle kod yazıyoruz, uğraşıyoruz ama hangi alet çantamızda olmalı, onu tam seçemediğimiz anlar olur ya, işte Dapper da tam oralarda devreye giriyor sanki. Neyse efendim, ben yaklaşık 10 yıldır bu işlerin içindeyim, C# ile REST API’ler falan filan, anlarsınız ya… Ve itiraf etmeliyim ki, bir ara bu ORM işleri beni biraz bunaltmıştı açıkçası. Yani öyle ki, her işlem için bir sürü kod yazmak gerekiyordu, sonra baktım ki işin içinden çıkamıyorum galiba.
ORM (Object-Relational Mapping) dediğimiz şey, aslında veritabanı objeleriyle kod objelerini eşleştirmek için var ya… Güzel tabii, çok da kullanışlı. Ama bazen o kadar karmaşıklaşıyor ki, sanki araba kullanmak yerine uçak kullanmaya çalışıyorum gibi hissediyorum. Hani o kadar çok kavram, o kadar çok ayar, o kadar çok katman… Mesela Entity Framework gibi ORM’ler işi kolaylaştırıyor ama bazen performans açısından biraz ağır kalabiliyor. Zaten bu performans konusu da hepimizin canını sıkıyor hani, değil mi? Uygulamanız ne kadar hızlıysa, kullanıcılarınız o kadar mutlu oluyor, yoksa ne oluyor… Bekliyorlar, bekliyorlar, sonra da ‘Bu ne biçim iş!’ deyip gidiyorlar.
İşte tam da bu noktada micro-ORM’ler devreye giriyor. Dapper da bu micro-ORM tayfasının en popülerlerinden biri. Peki, ne farkı var derseniz, asıl olay burada başlıyor. Micro-ORM demek, her şeyi sizin yönettiğiniz, daha az soyutlama ve dolayısıyla daha fazla kontrol anlamına geliyor. Kendi SQL sorgularınızı yazıyorsunuz, Dapper da o sorguları alıp sizin için objelere dönüştürüyor. Yani Dapper, sanki bir çevirmen gibi düşünün; siz istediğiniz mesajı veriyorsunuz, o da bunu makine diline çevirip veritabanına gönderiyor ve gelen cevabı yine size anlaşılır bir şekilde geri getiriyor.
Biraz daha açalım o zaman bu durumu. Dapper’ın en büyük artısı, hızı. Gerçekten inanılmaz hızlı. Çünkü arkada sadece basit bir SQL sorgusu çalıştırıp sonuçlarını alıyorsunuz. Hani bazen bir şeyi düzeltmek için tek bir hamle yaparsınız ya, Dapper da uygulamanızın performansını ciddi şekilde artırabilir. Yani öyle optimize edilmiş ki, bazen sanki direkt olarak veritabanıyla konuşuyormuşsunuz gibi hissediyorsunuz. Bu da geliştirme sürecini de hızlandırıyor tabi ki. Çünkü karmaşık sorgularla boğuşmak yerine, doğrudan istediğiniz veriyi çekebiliyorsunuz.
Şimdi gelelim bu işi nasıl yapıyoruz kısmına. Hani hep diyoruz ya ‘kod örneği şart’ diye, işte şimdi zamanı. Normalde Entity Framework gibi bir ORM ile bir kullanıcı çektiğinizde şöyle bir şey yazmanız gerekir sanırım:
“`
// YANLIŞ YAKLAŞIM (ORM ile, daha fazla kod)
var kullanici = await _context.Kullanicilar.FirstOrDefaultAsync(u => u.Id == id);
if (kullanici == null)
{
return NotFound();
}
return Ok(kullanici);
“`
Bu gayet anlaşılır, değil mi? Fakat işte bazen bu kadar kod yazmak yerine, doğrudan veriyi çekmek istiyoruz. İşte orada Dapper farkını ortaya koyuyor. Dapper ile bu işi yapmak inanın ki daha basit ve çok daha hızlı oluyor. Asıl olay, SQL sorgusunu doğru yazmakta. Şimdi göstereceğim örnekte, SQL Server’da çalışacak basit bir sorgu kullanacağız.
Gerçi tam emin değilim ama, Dapper’ın asenkron metotları gerçekten süper. Yani uygulamanızın bloklanmasını engelliyor. Bu da kullanıcı deneyimi için çok önemli. Düşünün ki, bir işlem yaparken uygulamanız kilitleniyor, o ne sıkıcı bir durum olurdu değil mi?
Şimdi gelelim DOĞRU ve DAHA HIZLI yaklaşıma, yani Dapper ile:
“`
// DOĞRU YAKLAŞIM (Dapper ile, daha az kod ve daha hızlı)
using (var connection = new SqlConnection(_connectionString))
{
var kullanici = await connection.QueryFirstOrDefaultAsync
\”SELECT Id, Ad, Soyad, Email FROM Kullanicilar WHERE Id = @KullaniciId\”,
new { KullaniciId = id });
if (kullanici == null)
{
return NotFound();
}
return Ok(kullanici);
}
“`
Gördüğünüz gibi, çok daha az satır kod! Ve tabi ki, performans farkı da inanılmaz derecede hissediliyor. Burada kullandığımız `QueryFirstOrDefaultAsync` metodu, belirtilen SQL sorgusunu çalıştırıyor ve ilk eşleşen `Kullanici` objesini getiriyor. `new { KullaniciId = id }` kısmı da SQL sorgumuzdaki parametreyi bağlamamızı sağlıyor ki, bu da SQL injection gibi şeylerden korunmamızı sağlıyor. Tamamen güvenli ve hızlı yani.
Peki neden bu kadar önemli bu Dapper olayı? Neticede, özellikle performansın kritik olduğu projelerde, mikro-ORM’ler hayat kurtarıcı olabiliyor. Düşünün ki bir e-ticaret sitesi yapıyorsunuz ve her milisaniye önemli. Kullanıcılar ürünleri hızlı görmek ister, sepetlerine eklemek ister. İşte bu gibi durumlarda Dapper, size aradığınız hızı ve esnekliği sunuyor. Açıkçası ben de kendi projelerimde yeri geldiğinde direkt Dapper kullanıyorum, yeri geldiğinde Entity Framework’ün nimetlerinden faydalanıyorum. İkisi de doğru yerde kullanıldığında harika araçlar. Önemli olan, ne zaman hangisini kullanacağını bilmek.
Bu arada, Dapper’ı kullanmak için SQL Server dışındaki veritabanları için de adaptörleri mevcut, yani PostgreSQL, MySQL gibi veritabanlarıyla da rahatlıkla kullanabilirsiniz. Yani teknolojinize bağlı kalmak zorunda değilsiniz. Google’da kısa bir arama yaparsanız, farklı veritabanları için de örneklerini bulabilirsiniz. Mesela şurada örnekler var sanırım.
Sonuç olarak, Dapper dediğimiz şey bir miraculum değil tabii ki, ama doğru kullanıldığında inanılmaz faydalı bir araç. Özellikle performans ve esneklik sizin için öncelikliyse, kesinlikle denemeye değer. Hani oyun oynarken süper güçleriniz olsa nasıl olurdu? Dapper da sizin için bir nevi böyle bir şey olabilir. Tabii ki öğrenme eğrisi var, o da ayrı bir konu. Ama inanın bana, biraz uğraştıktan sonra ‘İyi ki öğrenmişim!’ diyeceksiniz. Ne güzel değil mi?