Son Haberler
Anasayfa / Architecture & Design / Repository Pattern

Repository Pattern

Repository Pattern ortak olarak yaptığımız operasyonlar için tek bir class üzerinde generic olarak ayarlayıp daha sonra diğer class’larımızdaki aynı operasyonların sağlanabilmesi için oluşturabileceğimiz bir pattern’dir. Örnek vermek gerekirse, uygulamamızda Entity Framework kullanıyoruz ve 20 tablomuz yani entity’miz bulunmakta. Bizim bu 20 tablo için de Select,Insert,Update, Delete işlemlerini gerçekleştirmemiz gerekiyor. Kısa bir hesaplama ile tek bir entity için 4 metod yazmamız gerekiyor. 20 entity için 80 adet metod oluşturacağız ve aynı operasyonları gerçekleştirecek. Sadece ilgili classlar üzerinde bir değişiklik olacak. Fakat bunun hem yazımı hem de yönetimi biraz zor olacağından ve fazlasıyla iş yükü olduğundan dolayı bu işlemler için repository pattern deseni ile tek bir class üzerinden bu işlemleri gerçekleştirebiliriz. Yeni bir metod eklemek istersek de bu pattern üzerinden eklediğimiz takdirde tüm hepsi için de geçerli olacaktır. Hem de bizi iş yükünden kurtaracaktır.

public class RepositoryPattern where T : class,new()
{
private IObjectContextAdapter _context;
private IObjectSet _objectSet;


public RepositoryPattern()
{
_context = new RepositoryPatternDbContext();
_objectSet = _context.ObjectContext.CreateObjectSet();
}


public IQueryable AsQueryable()
{
return _objectSet;
}


public T First(Expression<Func<T, bool>> condition)
{
return _objectSet.First(condition);
}


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


public List GetAllList(Expression<Func<T, bool>> condition = null)
{

return condition == null ? _objectSet.ToList() : _objectSet.Where(condition).ToList();
}

public List GetAllListOrderBy(Expression<Func<T, bool>> condition)
{
return _objectSet.OrderBy(condition).ToList();
}

public void Delete(T entity)
{
_objectSet.DeleteObject(entity);
Save();
}

public void Add(T entity)
{
_objectSet.AddObject(entity);
Save();
}

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

public void Save()
{
_context.ObjectContext.SaveChanges();
}
}

Yukarıdaki şekilde RepositoryPattern Generic class’ı oluşturup içerisine metodlarımızı da generic bir şekilde tanımlıyoruz.

Entity class’ımızı da oluşturuyoruz.

public class Category
{
public int CategoryId { get; set; }
public string CategoryName { get; set; }
}

Entity class’ımızı da oluşturduktan sonra da nasıl kullanabiliriz ondan bahsetmek istiyorum.

RepositoryPattern repoCategories = new RepositoryPattern();
var categories = repoCategories.GetAllList();

RepositoryPattern class’ımızı generic bir yapıdaydı. RepositoryPattern tanımlaması yaparken entity’mizi de Category olarak belirledik. Repository class’ımızda yazdığımız metodların hepsi Category entity’miz için repoCategories de oluşturuldu ve sonrasında istediğimiz şekilde yazdığımız metodları yazarak veri işlemlerini gerçekleştirebiliriz.