1. Ana Sayfa
  2. ASP.Net

Dapper’ın ASP.NET Core Web API ile Kullanımı

Dapper’ın ASP.NET Core Web API ile Kullanımı
0

Bu yazımda Stack Overflow ekibi tarafından geliştirimiş open-source bir Micro-ORM aracı Dapper’a yer vermek ve ASP.NET Core API ile basit bir uygulamasını göstermek istiyorum. Dapper’ı anlatmaya başlamadan önce ORM kavramını kısaca hatırlayalım.

ORM (Object Relational Mapping)’i nesne yönelimli uygulamalar ile ilişkisel veritabanları arasındaki bir köprü olarak düşünebiliriz. Nesne yönelimli bir model kullanarak hızlı ve etkili veritabanı sorguları yazabilmemizi sağlar.
Temel olarak veri erişimini soyut ve taşınabilir hale getirdiği için kullandığımız veritabanı çeşitlerinden bağımsızdır. Aynı zamanda birçok nesne yönelimli programlama dili tarafından desteklenmektedir. Taşınabilirlik, geliştirme ve bakım kolaylığı sebebiyle yazılım dünyasında oldukça yaygın bir tekniktir.

Dapper ise .NET destekli bir Micro-ORM aracıdır. Az önce ORM’den bahsetmiştik. Micro-ORM’i ise lightweight bir ORM olarak tanımlayabiliriz. Resim – 1’deki tabloda Micro-ORM ve ORM farklarına bakarsak Micro-ORM sadece object mapping yapabilmeyi amaçlarken ORM’in diğer özelliklerini taşımamaktadır. ORM’e göre özellikleri sınırlıdır ancak hızlı performans gösterir.

Resim – 1

Dapper da diğer .NET destekli ORM araçları içerisinde ADO.NET hızına yakın bir performans göstermesiyle öne çıkmaktadır. Database sorgularımız için senkron/asenkron çalışabilen extension methodlar sağlar.

ORM ve Dapper hakkında gerekli bilgileri edindikten sonra demo’ya geçebiliriz. Bu demo basit CRUD işlemleri yapacağımız bir ASP.NET Core Web API projesi olacak.

API projesini oluşturmadan önce bir database tablosuna ve verilere ihtiyacım var. Bu projede Product adında bir tablo kullanacağım. Örnek tabloyu aşağıda görebilirsiniz.

Resim – 2

Database adımından sonra artık Web API projemizi oluşturmaya geçebiliriz.

Bildiğiniz üzere .NET 7.0 geçtiğimiz aylarda kullanıma sunuldu. Visual Studio’ya dönelim ve .NET 7.0 ile bir ASP.NET Core Web API projesi oluşturalım.

Resim – 3’te gördüğünüz gibi DapperDemo adında bir proje oluşturduk. Biz kendi model ve controller’ımızı yazacağımız için örnek projedeki WeatherForecast.cs ve WeatherForecastController.cs dosyalarını kaldırabiliriz.

Resim – 3

Sıra Dapper’ı projemize eklemeye geldi. Solution’a sağ tıklayarak Manage NuGet Packages For Solution seçeneğine gidelim ve Dapper paketini projemize yükleyelim.

Eğer Package Manager Console kullanıyorsanız PM> Install-Package Dapper komutuyla paketi yükleyebilirsiniz.

Resim – 4

Artık API projemizi oluşturmaya hazırız. Öncelikle database tablomuza karşılık gelen modelimizi oluşturmalıyız. Projede Entities adında bir klasör oluşturalım. Bu klasör Product class’ımızı içerecek.

Resim – 5

Resim – 6

Modelimizi oluşturduktan sonra appsettings.json dosyası içerisine aşağıdaki gibi SQL connection string’i ekleyelim.

Resim – 7

Daha sonra Helpers adında yeni bir folder ve bu folder altında ConnectionHelper isimli bir class oluşturalım.

Resim – 8

Resim – 9

Gördüğünüz üzere CreateSqlConnection methodu, SqlConnection sınıfından bir instance döndürür. Bu methodu database’e erişmek için kullanacağız.

Daha sonra Program.cs’e gidelim ve ConnectionHelper’ı burada singleton olarak tanımlayalım.

Resim – 10

Bu sayede CreateSqlConnection methodunu ilgili class’larda Dependency Injection yardımıyla kullanabiliriz.

Artık yavaş yavaş repository’imizi oluşturmaya başlayabiliriz. Öncelikle Interfaces adında bir folder ve içerisinde IProductRepository adında bir interface oluşturalım.

Resim – 11

Resim – 12

Daha sonra Repositories folder’ı altında ProductRepository adında bir class oluşturalım.

Resim – 13

Resim – 14

Az önce yaptığımız gibi yine Program.cs’e gidelim ve ProductRepository ve IProductRepository’i scoped olarak tanımlayalım.

Resim – 15

Artık ilk sorgularımızı yazmak için hazırız. IProductRepository’e gidelim, GetProducts ve GetProductById methodumuzu tanımlayalım.

Resim – 16

Resim – 17’de gördüğünüz üzere GetProducts methodu içerisinde basit bir select sorgusu yazdık ve Dapper’ın Query extension methodunu çağırdık. Query ile bir sorguyu execute edebilir ve dönen sonucu mapleyebiliriz.

GetProductById methodunda ise ilgili sorguyu execute eden ve dönen ilk sonucu eşleyen QueryFirst method’unu çağırdık.

Resim – 17

Şimdi Controllers folder’ı altında yeni bir ProductController oluşturalım.

Resim – 18

Resim – 19

Şu an GetProducts ve GetProductById methodlarımız için her şey hazır. Artık uygulamamızı çalıştırabilir ve sonucu görebiliriz. İlk örneğimizi Swagger üzerinden göstermek istiyorum. Daha sonraki requestler için Postman ile devam edeceğim.

Resim – 20

Swagger paketi proje ile kullanıma hazır geliyor ve bizlere requestler için kullanması kolay ve güzel bir arayüz sağlıyor. Get methodunu çalıştırdığımızda Product listesinin başarıyla döndüğünü görmekteyiz.

Resim – 21

Resim – 22

Şimdi database tablosunda yeni bir Product oluşturmak istiyorum. Az önce yaptıklarımı tekrar uygulayacağım fakat burada küçük bir fark olacak.

Aşağıda gördüğünüz gibi Product tablosunun ProductID kolonu auto increment özelliğe sahip, yani tabloya yeni bir product eklendiğinde ProductID zaten setlenmiş olacak.

Resim – 23

Bu yüzden Post request gönderirken modelimi sınırlandırmak istiyorum. Models folder’ı altında ProductDTO adında yeni bir class oluşturalım ve bu class ProductID’yi içermesin.

Resim – 24

ProductDTO’yu oluşturduktan sonra yukarıdaki mantıkta ilerleyerek CreateProduct methodumuzu oluşturalım.

Resim – 25

CreateProduct methodunu oluşturmak için basit bir insert sorgusu yazdıktan sonra Execute methodunu çağırıyoruz.  Bu extension method ile bir sorguyu bir veya birden çok kez execute edebilir ve etkilenen satır sayısını döndürebiliriz.

Resim – 26

Controller’a gidip Post methodumuzu oluşturalım.

Resim – 27

Daha sonra projeyi tekrar çalıştıralım ve Postman’de Post requestimizi gönderelim.

Resim – 28

Product’ın tabloya başarıyla eklendiği sonucunu almış olduk.

Şimdi Update ve Delete ile çalışmaya devam edebiliriz. IProductRepository’de UpdateProduct ve DeleteProduct methodlarımızı oluşturalım.

Resim – 29

Yine benzer şekilde bu iki methodu ProductRepository’de uygulayalım. Resim – 30’da gördüğünüz üzere query ve parametrelerimizi tanımlıyoruz ve Execute methodu ile querylerimizi çalıştırıyoruz.

Resim – 30

Ardından ilgili action’larımızı ProductController’a ekliyoruz.

Resim – 31

Artık Update ve Delete requestlerimizi göndermeye hazırız. Uygulamayı başlatıp Postman’e geri dönelim ve requestlerimizi gönderelim.

Resim – 32

Resim – 33

Update ve Delete requestlerinin başarıyla sonuçlandığını gördükten sonra son örneğimize geçebiliriz.

Bu örneğimizde Dapper ile nasıl store procedure çalıştırabileceğimizi göstermek istiyorum. Öncelikle database’imizde CategoryId gönderildiğinde ilgili Product’ların listesini döndüren basit bir store procedure oluşturalım.

Resim – 34

IProductRepository’de GetProductsByCategoryId isimli methodumuzu oluşturalım.

Resim – 35

ProductRepository’de bu methodu Resim – 36’daki gibi uyguluyoruz. Oluşturduğumuz sproc’u çağırabilmek için Query methodu içerisinde sproc adını, sproc içerisinde geçeceğimiz parametreyi ve command type’ı Store Procedure olarak tanımlıyoruz. Burada sonuç olarak bir liste beklediğimiz için Query methodunu kullandık. Bir değer beklemediğimiz durumlarda Execute methodunu kullanmalıyız.

Resim – 36

Diğer örneklerimizde olduğu gibi ProductController içerisinde action’u tanımlıyoruz.

Resim – 37

Uygulamayı çalıştırıp Postman’e dönelim ve Get requestimizi gönderelim.

Resim – 38

Resim – 38’de gördüğünüz üzere CategoryId’si 3 olan Product’ların bir listesini başarıyla alabildik.

Yazımın sonuna gelirken Dapper ile ilgili daha fazla bilgi edinmek isterseniz Learn Dapper sayfasını ziyaret edebilirsiniz. Ayrıca demo’nun kaynak kodlarına GitHub hesabım üzerinden erişebilirsiniz.

Faydalı olması dileğiyle. 😊

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

https://www.mshowto.org

https://www.learndapper.com/

https://github.com/DapperLib/Dapper

TAGs: .net core wep api, dapper, micro orm , orm, dapper nedir

Bu İçeriğe Tepkin Ne Oldu?

Yazar Hakkında

2019 yılında Yıldız Teknik Üniversitesi Matematik Mühendisliği bölümünden mezun oldum. Stajlarımı Ziraat Teknoloji ve Halkbank BT’de tamamladım. Lisans eğitimim ve yaptığım stajlar yazılım alanına yönlenmemi sağladı. Şu an 360 DOTNET’te Software Engineer olarak çalışıyorum ve C#, JavaScript, AngularJS, WinForms, WPF, .NET Framework/Core with MVC, MSSQL Server, Azure DevOps ve Microsoft Azure konularında kendimi geliştirmeye devam ediyorum.

Yorum Yap