SQL LIFE

C# Repository Pattern Entity FrameWork Kullanımı

asp.net c# repository pattern kullanımı


Merhaba, asp.net c# projelerinde, Repository pattern ile Entity Framework CRUD işlemlerini tek bir generic sınıf üzerinden yapabiliriz. Öncelikle Singleton pattern mantığı ile tek bir DbContext instance oluşturuyorum. Her seferinde DBRehberEntities nesnesi oluşturup DB’ye yeni bir bağlantı ile gitmemesini sağlıyorum.

 public class RepositoryBase
    {
        //Singleton pattern kullanmış olduk
        private static DBRehberEntities _db;
        private static object _lockSync = new object();

        protected RepositoryBase() { }

        public static DBRehberEntities CreateContext()
        {
            if (_db == null)
            {
                lock (_lockSync)
                {
                    if (_db == null)
                    {
                        _db = new DBRehberEntities();
                    }
                }
            }
            return _db;
        }
    }
 

Repository.cs sınıfının constructor'ında  RepositoryBase sınıfından DbContext nesnesini alıyoruz.

 
public class Repository<T> where T : class
    {
        private DBRehberEntities db ;
        private DbSet<T> _objectSet;

        public Repository()
        {
            db = RepositoryBase.CreateContext();
            _objectSet = db.Set<T>();
        }
        public List<T> List()
        {
            return _objectSet.ToList();
        }

        public IQueryable<T> List(Expression<Func<T,bool>> where)
        {
            //ToList yapınca sql e sorgu atılır, db ye gider o yüzden en somn toliist çalıştırr
            return _objectSet.Where(where);
        }
        public int Insert(T obj)
        {
            _objectSet.Add(obj);
            return Save();
       
        }
        public int Update(T obj)
        {
            _objectSet.Add(obj);
            return Save();
        }
        public int Delete(T obj)
        {
            _objectSet.Remove(obj);
            return Save();
        }
        private int Save()
        {
            return db.SaveChanges();
        }
        public T Find(Expression<Func<T, bool>> where)
        {
            return _objectSet.FirstOrDefault(where);
        }
    }

İsterseniz bir interface aracılığı ile Repository sınıfının metotlarını implement edebilirsiniz.
 

public interface IRepository<T> where T: class
    {
        IQueryable<T> FindAll();
        IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression);
        bool Create(T entity);
        bool Update(T entity);
        bool Delete(T entity);
    }
IRepository interface’ini kullanmak istersek kullanım:
public class Repository<T> : IRepository<T> where T : class

Son olarak Repository sınıfını Aciton Result metodu içinde şu şekilde kullanılabilir:

 
Repository<Soru> repository = new Repository<Soru>(); //globalde tanımlı

Var soruList = repository.List(x=>x.kategoriid == 2);
		//veya
Soru soru = new Soru();
soru.kategoriid = 2;
soru.optime = DateTime.Now;
repository.Insert(soru);
            


 
#
Ezgim Çelik
They didn't know it was impossible, so they did it - Mark Twain