Dapper Nedir?
Aşağıdaki tabloda ORM araçlarının performansları sıralanmıştır. Genelde Orm araçları biraz yavaş çalışır. Tabloda gördüğümüz üzere, en çok kullandığımız ORM araçlarından biri olan Entity Framework ve LinqToSql performans sırasında en sonlarda yer almaktadır. Bu sebeple özellikle yoğun trafik alan e-ticaret projeleri gibi hız konusunda hassas projelerde bu ORM araçları pek tercih edilmez. Bu gibi durumlarda bir “Micro Orm” çözüm olabilir.
Yukarıdaki tabloyu dikkate aldığımızda en çok göze çarpan Dapper’dır. Dapper Stackoverflow.com ekibi tarafından geliştirilmiş, ücretsiz ve açık kaynak kodlu bir C# kütüphanesidir.
Dapper implementasyonuna geçmeden kısaca dapper’in bize sağladığı güzellikler hakkında konuşalım
Dapper Hafif (Lightweight) bir yapısı sayesinde mapping yapmak için arkada herhangi bir designer, konfigürasyon veya xml dosyası gibi şeylere ihtiyaç duymamaktadır. Bu yüzden daha basit bir kullanım sunmaktadırlar. Bunun yanında dapper ile direkt olarak katı sql sorguları yazıp çalıştırdığımız için sonuçlara çok daha hızlı ulaşırız ki bunun sonuçları yukarıdaki tabloda açık bir şekilde görülmektedir.
Burada aslında Sql sorgusunu ham hali ile yazmak geçmişte bizlere sıkıntı yaratan “Sql Injection” problemini tekrar gündeme getirebilir. Dapper’da buna önlem olarak aşağıda da örnekleri bulunan, dinamik parametre adında yapılar geliştirilmiştir. Sorgu içerisindeki parametreleri hand-coded olarak değil de dinamik olarak sorgunun içerisine gömmeyi sağlamaktadır. Buna ilaveten Dapper ile stored prosedürler ile çalışmakta mümkün.
Kurulum ve kodlamaya geçmeden önce aşağıda yer alan örneklerden oluşan basit bir dapper entegrasyonuna github hesabımdan da ulaşabilir kendi databaseinize bağlayarak ayağa kaldırabilirsiniz.
1.Dapper Kurulumu
- Nuget Packet Managerden aşağıdaki Dapper paketini kuralım.
- Hemen ardından References içerisine Dapper dll’i gelecektir.
- Dapperi kurduğumuza göre şimdi biraz da kodlama kısmına geçelim. Aşağıda bir dapperRepository classımız mevcut. Bu class daha nesnesi oluşturulur oluşturulmaz kendi içerisindeki _connection değişkeni üzerinden connectionu oluşturacak şekilde soyutlanmıştır.
public class DapperRepository { private readonly IDbConnection _connection; public DapperRepository() { _connection = new SqlConnection("Your Connection String"); } public IDbConnection Connection { get { return _connection; } } public void Dispose() { if (_connection != null) _connection.Dispose(); } }
- Aşağıda da bir dapperRepository nesnesi oluşturarak bunun üzerinden DapperRepository classında tanımladığımız Connection propertimize onun üzerinden de Query metodumuza ulaşıyoruz. Querynin jenerik dönüş tipi <...> içerisinde, veritabanından çekilecek verilerin modeli, your query kısmına da çalıştırmak istediğiniz soru yazılır. Aslında tüm olay bundan ibarettir.
namespace DapperExample { public class Program { static void Main(string[] args) { DapperRepository microOrm = new DapperRepository(); var result = microOrm.Connection.Query<Your Model>("your query").ToList(); Console.ReadKey(); } }
2. DAPPER İLE DİNAMİK PARAMETRE TANIMLAMA
Dapperda Sql injection problemine çözüm olarak, query stringimize dinamik olarak değişken tanımlayabiliriz. Aşağıda bunun basit bir örneği gösterilmiştir. Sorgunun çalıştırılması sırasında dinamik olarak değişecek parametreleri string içinde @degiskenIsmi şekilde tanımlar daha sonrasında da parameters.Add(“degiskenIsmi”, degiskenDegeri); şeklinde sorgunun çalıştırılması sırasında dinamik değişkenin hangi değer ile yer değiştireceğini belirleriz.
DynamicParameters parameters = new DynamicParameters(); var query = "select * from Kitap where KitapId=@Id"; parameters.Add("Id", 1); var resultForDynamicParameters = microOrm.Connection.Query<Kitap>(query, parameters).FirstOrDefault()
3. Dapper ile Çoklu Sorgu Çalıştırma
Dapper ile birden fazla sorguyu senkron ya da asenkron olarak aşağıdaki gibi çalıştırabiliriz.
var dapperQuery = microOrm.Connection.QueryMultiple("select * from Kitap where KitapId=3 select * from Yazar"); var kitap = dapperQuery.Read().FirstOrDefault(); var yazar = dapperQuery.Read().ToList();
Eğer bunu asenkron olarak yapmak istersek de aşağıdaki gibi bir yol izleyebiliriz.
public async System.Threading.Tasks.Task GetAsync() { IDapperRepository microOrm= new DapperRepository(); var dapperQuery = await microOrm.Connection.QueryMultipleAsync("select * from Kitap where KitapId=3 select * from Yazar"); var kitap = dapperQuery.Read().FirstOrDefault(); var yazar = dapperQuery.Read().ToList(); }
Yukarıda dapperi, dapper kurulumu ve basit bir kaç dapper metodu üzerinden elimden geldiği kadarıyla anlatmaya çalıştım. Yukarıdaki özelliklerin yanı sıra dapper bir çok farklı metodu (QueryFirst, QueryFirstOrDefault, QuerySingle, QueryFirst, QueryAsync …..) desteklemektedir. Bunun yanında yukarıda da bahsettiğim ancak detaylarına girmediğim bir diğer konu olarak dapper ile storedProsedurelerinizi çalıştırabilirsiniz.