Neden Repository Pattern kullanmalıyız?

Niyazi Ekinci
2 min readMay 9, 2020

--

Herkese merhaba,

Şu sıralar bitirme projemle ilgilenmekteyim. Bitirme projemle uğraşırken bir çok şey öğrendim. Yanlış bildiğim bir çok şeyi düzeltme şansı elde ettim benim açımdan gayet verimli bir süreç oldu. Yine Repository Pattern ile de bu süreçte tanıştım. Yaşadığım süreçten kısaca bahsetmek istiyorum.

Öncelikle bitirme projemi yazarken endüstri standartlarında bir kod yazmak, temiz ve maintain edilebilir bir kod yazmak için arayış içindeydim. Çeşitli araştırmalar yaptım. Bu araştırmalar sonucu, bir çok mimariyle ve design pattern’le tanıştım. Repository Pattern ile de bu süreçte tanıştığımı belirtmiştim. Ne işe yaradığını ne amaçla kullanıldığını merak ederek tekrardan repository pattern ile ilgili araştırmalar yapmaya başladım. Araştırma yaparken, endüstri de yoğun bir şekilde tartışılan konuya rastladım. Tartışmanın konusu: Repository Pattern kullanmaya gerek var mı?

Tartışma içinde, Entity Frameworkün zaten repository pattern kullanılarak yazıldığını, neden repository pattern kullanılarak yazılmış bir şeyi tekrardan repository pattern kullanarak yazmamız gerektiğini sorgulayan insanlar vardı. Bu soru, bana çok mantıklı gelmişti. Gerçekten Entity Frameworkun yapısına baktığımda Unit Of Work Pattern ile birlikte Repository Pattern kullanılmıştı. Ama tutorial’lara baktığımda ısrarla entity framework ile repository pattern’in birlikte kullanıldığını görmüştüm. Yine kullandığım framework gereği Microsoftun sitesindeki makaleleri okumaya başladım. Makalede Entity Framework’un zaten Repository Pattern kullanılarak yazıldığını ama isterseniz yine de bu patterni tekrar kullanabileceğiniz yazıyordu.

Daha sonra, soyutlama ve dependency injection ile tanıştım. Bu konu aslında soru işaretlerimi ortadan kaldırmaya yetmişti. Çünkü, Entity Frameworkun Repository Pattern kullanarak projeyi Databaseden soyutladığı gibi, Entity Frameworkün üzerine getirilen ek soyutlama(Repository Pattern) beni Entity Frameworkten soyutlayacaktı. Yani, nasıl ki, entity framework’te MySQL’den SQL Servera geçtiğimizde kodumuzda hiçbir değişiklik yapmıyorsak. Entity Framework’ten Dapper’a NHibernate’e geçtiğimizde üst katmanımızın hiç birşeyden haberi olmayacak ve üst katmanda hiç bir değişiklik yapmak zorunda kalmayacaktık. Üst katmanın bilmesi gereken sadece Data Access Layerla arasındaki olan sözleşme yani interface. Dependency Injection sayesinde, örneğin, IProductRepository Interface’imize dilediğimizde EfProductRepository’yi dilediğimizde HibernateProductRepository vererek üst katmanda hiçbir değişiklik yapmadan alt katmandaki frameworkü değiştirebileceğiz. Yine aynı şekilde veriye erişim katmanının test edilmesi kolaylaşacak. Aşağıda da görüldüğü gibi, EfProductRepository ve HibernateProductRepository IProductRepository interface’inden implement edilmiş ve üst katman olan ProductService dependency olarak IProductRepository’i almıştır. Yani ProductService sadece alt katmandan Productu alabildiğini, ekleyebildiğini bilmekte fakat bunun nasıl yapıldığını hangi database’e, hangi frameworkle erişildiğini bilmemekte. buda onu alt katmandan soyutlayarak daha az bağımlı olmasını sağlamaktadır. Yapılan herhangi bir değişiklik ProductService classını etkilemeyecektir.

Yukarıdaki kod sadece IProductRepository interfaceine bağımlıdır. Startup.cs dosyasında IProductRepository’e concrete etmek istediğimiz classı (örneğimizde Hibernate veya Ef) vererek,

ProductService class’ının yaratılma esnasında, IProductRepository yerine startup classına verdiğimiz classı oluşturması beklenmekte ve sonucunda kodumuz alt katmana daha az bağımlı olmaktadır.

Interface (Sözleşmemiz)
Hibernate Repository
EF Repository

Peki eğer Repository Pattern kullanmadan yani soyutlamadan, Product Service classını direkt olarak entity framework veya hibernate ile kodlarsak ne olurdu?

Gördüğümüz gibi Service classımız direkt olarak EntityFramework ile bağımlı eğer Hibernate’e geçmek istersem, ya service classındaki çoğu kodu (logic ile birlikte) yada direkt service classını değiştirmek zorunda kalacağım. Bu da hiç kimsenin, özellikle büyük projelerde, istemeyeceği birşeydir. Kısaca repository patternin aslında ne amaçla kullanıldığına ne işe yaradığına ve faydalarına değindik.

Umarım herkes için faydalı bir yazı olmuştur. Görüşmek üzere.

--

--