Repository Pattern

Büyük projeler geliştirirken yaşadığımız en büyük sıkıntı kod tekrarlarıdır. Özellikle iş katmanımızda veritabanına insert, update, delete yaparken birçok tekrar yapmaktayız. Repository pattern bizi bu dertten kurtarmaktadır. Bu yazımızda Entity Framework ile repository pattern’ın nasıl kullanılacağını öğreneceğiz.

İlk önce NuGet Package Manager kullanarak Entity Framework kütüphanesini projemize ekliyoruz.

Daha sonra projemize bir interface ekliyoruz ve aşağıdaki kodları yazıyoruz.

using System;
using System.Linq;
using System.Linq.Expressions;
 
namespace RepositoryPattern
{
    interface IRepository<T>
    {
        void Insert(T entity);
        void Delete(T entity);
        IQueryable Search(Expression<Func<T, bool>> predicate);
        IQueryable GetAll();
        T GetById(int id);
    }
}

Bu yazdığımız interface yazacağımız repository sınıfımız için bir şablon olacaktır. Oluşturduğumuz interface T tipinde generic nesne tipi almaktadır. Projemize repository kodlarımızı yazacağımız sınıfımız ekleyelim.

using System;
using System.Data.Entity;
using System.Linq;
 
namespace RepositoryPattern
{
    public class Repository<T> : IRepository<T> where T : class
    {
        DbSet set;
 
        public Repository(DbContext context)
        {
            set = context.Set<T>();
        }
 
        public void Insert(T entity)
        {
            set.Add(entity);
        }
 
        public void Delete(T entity)
        {
            set.Remove(entity);
        }
 
        public IQueryable Search(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return set.Where(predicate);
        }
 
        public IQueryable GetAll()
        {
            return set;
        }
 
        public T GetById(int id)
        {
            return set.Find(id);
        }
    }
}

Repository sınıfımızı IRepository sınıfından türettik ve interface üyelerini implement ettik. Metot gövdelerini de Entity Framework metotlarıyla yazdık. Kodumuzdaki T tipi bir entity tipi temsil etmektedir. Şimdi yazdığımız kodun nasıl kullanıldığını örnek olarak görelim.

using System;
 
namespace RepositoryPattern
{
 class Program
 {
 static void Main(string[] args)
 {
 Repository<Categories> categories = new Repository<Categories>(new NorthwindEntities());
 
foreach (Categories item in categories.GetAll())
 {
 Console.WriteLine(item.CategoryName);
 }
 }
 }
}

Kodda gördüğünüz gibi T tipi olarak NortwindEntities altında bulunan Categories tipi verilmiştir. Artık repository nesnemiz Categories tipini kullanarak çalışacaktır. Kodu derleyip çalıştırdığımızda aşağıdaki ekran görüntüsü gelecektir.