Selam arkadaşlar, bu yazımda sizlere Repository Pattern konusundan bahsedeceğim.
Repository Pattern Nedir?
Arkadaşlar, 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.
Peki nasıl oluşturabiliriz bu Repository Pattern’i?
// RepositoryPattern class'ımızı aşağıdaki gibi oluşturuyoruz. public class RepositoryPattern<T> where T : class,new() { private IObjectContextAdapter _context; private IObjectSet<T> _objectSet; public RepositoryPattern() { _context = new RepositoryPatternDbContext(); _objectSet = _context.ObjectContext.CreateObjectSet<T>(); } public IQueryable AsQueryable() { return _objectSet; } public T First(Expression<Func<T, bool>> condition) { return _objectSet.First(condition); } public IEnumerable<T> Find(Expression<Func<T, bool>> condition) { return _objectSet.Where(condition); } public List<T> GetAllList(Expression<Func<T, bool>> condition = null) { return condition == null ? _objectSet.ToList() : _objectSet.Where(condition).ToList(); } public List<T> 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<Category> repoCategories = new RepositoryPattern<Category>(); 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.
Umarım faydalı olmuştur.
Bir sonraki yazıda görüşmek üzere…
Hocam merhaba, peki bunu view tarafında nasıl çekicez?
Merhaba, ‘
RepositoryPattern Category
‘ veya herhangi başka bir model ile tanımlama yapıldığında ilgili modeller üzerinden işlemler gerçekleştirilir. Yani Category modeli tanımlandıktan sonra GetAllList() metodu çağırıldığında listenin tipi Category List şeklinde olacaktır. Bu sonucun View’a aktarılmasını( return View(categoryList) ) controller tarafında sağlayabiliriz. Daha sonra da ilgili model tanımlamasıView içerisinde yapılır ve foreach,for kullanılarak listeleme işlemi gerçekleştirilebilir.