Bu katmanda veritabanındaki modeller üzerinden sorgu yazacağımız Repository yapılarını kurmamız gerekiyor. Öncelikle temel sorgular için Katman üzerinde Base klasörü, standart dışı sorgular için Concrete klasörü, Ve Interface yapılarını tutmak için ise Interfaces klasörlarini açalım.
Base klasörün içine gelerek Repository.cs adında class açalım.
Kullanılabilecek temel sorguları yazalım..
public class Repository<T> : IRepository<T> where T : BaseEntity
{
MyDbContext _db;
protected DbSet<T> table;
public Repository(MyDbContext db)
{
_db = db;
table=db.Set<T>();
}
private void Save()
{
_db.SaveChanges();
}
public bool Any(Expression<Func<T, bool>> exp)
{
return table.Any(exp);
}
public void Delete(int id)
{
T item= table.Find(id);
item.Status = DataStatus.Deleted;
item.ModifiedDate=DateTime.Now;
table.Update(item);
Save();
}
public List<T> GetActives()
{
return table.Where(x => x.Status != DataStatus.Deleted).ToList();
}
public List<T> GetByFilter(Expression<Func<T, bool>> exp)
{
return table.Where(x => x.Status != DataStatus.Deleted).Where(exp).ToList();
}
public T GetById(int id)
{
return table.Find(id);
}
public void HardDelete(int id)
{
T item = table.Find(id);
table.Remove(item);
Save();
}
public void Update(T item)
{
item.Status = DataStatus.Updates;
item.ModifiedDate = DateTime.Now;
table.Attach(item);
_db.Entry(item).State = EntityState.Modified;
table.Update(item);
Save();
}
public void Add(T item)
{
table.Add(item);
Save();
}
public int Count()
{
return table.Where(x => x.Status != DataStatus.Deleted).Count();
}
public int Count(Expression<Func<T, bool>> exp)
{
return table.Where(x => x.Status != DataStatus.Deleted).Where(exp).Count();
}
}
Bu Repo ile her modelden veri üzerinde işlem yapabiliriz. Fakat Bu repoyu UI katmanındaki controllerdan görebilmek için Interface'ini yazmamız gerekecek. O zaman Interfaces klasörü altına IRepository adında interface açalım ve bu fonksiyonların Interface yapılarını yazalım.
public interface IRepository<T> where T : BaseEntity
{
List<T> GetActives();
void Add(T item);
T GetById(int id);
void Update(T item);
void Delete(int id);
void HardDelete(int id);
List<T> GetByFilter(Expression<Func<T, bool>> exp);
bool Any(Expression<Func<T, bool>> exp);
int Count();
int Count(Expression<Func<T, bool>> exp);
}
Conrete altına ise örneğin User modeli ile yapacağımız ozel bir sorgu var ise UserRepository classını açıp, ınterface kımsına ise IUserRepository adında interface oluşturmamız gerekiyor. Proje şekillendiğinde yeniden Concrete yapısına döneceğiz. Şuan projenin sadece iskelet kısmını oluşturuyoruz.
Burada yaptığımız temel Repository sorgularının veritabanı yapısına haber verebilmek için UI katmanındaki startup.cs dosyasına gitmemiz gerekiyor. Örneğin User modelinde , temel repo sorgularını kullanabilmek için aşağıdaki gibi tanımlamamız gerekiyor.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(_configuration["ConnectionStrings:Mssql"]));
services.AddScoped<IRepository<User>, Repository<User>>();
// buraya yazacağımız tüm repository classlarını haber vermemiz , yazmamız gerekiyor...
}
Eğer User modelinde temel sorgulara ek olarak farklı sorgularda lazımsa Concrete altında UserRepository oluşturup, Repository classını miras aldıktan sonra, ek yazdığımız sorgu yapısı için interface classını açtıktan sonra , startup dosyasındaki bu alana aşağıdaki gibi tanımlama yapmamız gerekecektir.
services.AddScoped<IUserRepository, UserRepository>();
Şuan için BLL Katmanı projeye hazır hale geldi...
Hiç yorum yok:
Yorum Gönder