Repository Pattern Nedir?

17 Şubat 2013
Posted by Çağatay Yıldız
17148 Views
C#

Büyük proje bazlı çalışmalarda yer alan arkadaşların çektiği en büyük sıkıntılardan biri de kod tekrarıdır. Object Oriented Programing(Nesneye Dayalı Programlama) ve çok katmanlı mimari yapısına sahip projelerde bu tekrarların önüne geçmek hem iş maliyeti açısından hemde projeye müdahale açısından son derece can alıcı bir konudur. Örneğin 30 tablolu bir veritabanımız olduğunu varsayalım bu tabloların 20 sine birebir insert, delete, update ve listeleme işlemi yapmamız gerek
Yaklaşık 80 metot yazımı veya 20 servis class ı oluşturmak gibi bir kod yüküyle karşı karşıya kalıyoruz aynı zamanda bütün bu işlemler için tekrar bağlantı açıp kapanması gibi kod tekrarlarımız oluşmakta. Bu kod yükünün önüne geçmek için bu makalemizde Repository Pattern adı verilen bir pattern modelini inceleyip basit bir uygulama yapacağız ve böylelikle iş maliyetinin nasıl düşürüldüğünü göreceğiz. Peki Repository Pattern nasıl kullanılır? Uygulamamızda Entity Framework ORM ini kullanıp Visual Studio 2012 .Net 4.5 ile geliştireceğiz. Örnek veritabanı olarak hepimizin bildiği Northwind veritabanını kullanalım. ” Entitiy Framework Nedir? ” adlı makalemizde bağlantımızın nasıl gerçekleştiğini göstermiştik (http://cagatayyildiz.com/entity-framework-nedir/)
Gelelim Repository oluşturacağımız sınıfımıza. Bu sınıfı oluşturmadan önce o servis katmanına data.entity add reference sekmesinden eklemeyi unutmuyoruz.

Bu referansı ekledikten sonra entitiy framework dll ini eklemek için projeye sağ tıklayıp manage nuget packages ı tıklıyoruz

Daha sonra karşımıza gelen ekrandan Online bölümünü seçip Entity Framework dll ini insert ediyoruz

Şimdi ise repositroy isimli classımızı ekleyelim ve içindeki metotları ve namespace alanını inceleyelim. Eklediğimiz classın kod yapısı Northwind veritabanı örneğinde aşağıdaki şekildedir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects;
using System.Linq.Expressions;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data;
using RepositoryPattern.DataLayer;

public class Repository<T> where T : class
{
 IObjectContextAdapter _context;
 IObjectSet<T> _objectSet;

 public Repository()
 {

_context = new NorthwindEntities();
 _objectSet = _context.ObjectContext.CreateObjectSet<T>();
 }

public IQueryable<T> AsQueryable()
 {
 return _objectSet;
 }

public T First(Expression<Func<T, bool>> where)
 {

return _objectSet.First(where);
 }

public IEnumerable<T> Find(Expression<Func<T, bool>> where)
 {
 return _objectSet.Where(where);
 }

public void Delete(T entity)
 {
 _objectSet.DeleteObject(entity);
 _context.ObjectContext.SaveChanges();
 }

public bool Add(T entity)
 {
 _objectSet.AddObject(entity);
 _context.ObjectContext.SaveChanges();
 return true;
 }

public void Attach(T entity)
 {
 _objectSet.Attach(entity);
 _context.ObjectContext.SaveChanges();
 }

public List<T> Listele()
 {
 List<T> liste = _objectSet.ToList();
 return liste;
 }

public bool UpdateSaveChanges()
 {
 _context.ObjectContext.SaveChanges();
 return true;
 }
 // İçerisine aldığı order by sorgusuna göre sıralama yapar
 public List<T> Listele2<F>(Expression<Func<T, F>> where)
 {
 return _objectSet.OrderBy(where).ToList();
 }
 //Aldığı sorguya göre listeleme yapar
 public List<T> SorguyaGoreListele(Expression<Func<T, bool>> where)
 {
 return _objectSet.Where(where).ToList();
 }

}

Yukarıda bulunan “using RepositoryPattern.DataLayer;” isimli namespace imiz projemizin data katmanındadır.
Görüldüğü üzere tek bir sınıf üzerinden bir çok işlem yapılabilmektedir. Şimdi gelelim bu classımızda bulunan metotları basit bir uygulama ile nasıl kullanacağımıza. Öncelikli olarak bir .aspx sayfası oluşturup diğer katmanlarımızı referans ediyoruz. İki adet textbox ve button atıp basit bir insert işlemi gerçekleştireceğiz.

protected void Button1_Click(object sender, EventArgs e)
 {
 Repository<Categories> rptcat = new Repository<Categories>();
 Categories cat = new Categories();
 cat.CategoryName = TxtAd.Text;
 cat.Description = TxtAciklama.Text;
 rptcat.Add(cat);
 }

Görüldüğü gibi Repository isimli classımızdan instance aldıktan sonra içine categories nesnesini verdik ve direk sınıfımız o nesneye yönelik bir insert işlemi gerçekleştirdi. Classımızın içine verdiğimiz entitiy e göre içerisinde bulunan tüm işlemleri gerçekleştirecek ve böylelikle bizi çok büyük bir kod yükünden kurtaracaktır. Örneğin burada KategoriEkle isimli bir metot yazmamıza ve bağlantı açmamıza gerek kalmamıştır.
Bu pattern ile ilgili çok daha karmaşık sorgular yazılabilir ve iş maliyeti ciddi anlamda düşürülebilir.
Bir sonraki Repository Pattern yazımızda bu classımızın miras aldığı class ları ve içindeki karmaşık metotları inceleyeceğiz.