ASP.NET CORE'da Repository Design Pattern

Merhaba; bu makalede sizlere ASP.NET CORE'da Repository Design Pattern (Repository tasarım deseni) nasıl uygulanabileceğinden bahsedeceğim. Öncelikle gelin Repository Pattern neymiş bir göz atalım.
Repository Design Pattern
Repository tasarım deseni temelde, veritabanı ve veri katmanı işlemlerini sorumluluk olarak üstlenen sınıfın tasarlanmasıdır. Veritabanı aksiyonlarını, uygulamamızın business yapısından soyutlamak ve tek bir ortak noktada toplamak için bu sınıf kullanılır. Katmanlı mimarilerde sıkça kullanıldığı gibi kod karmaşıklığının önüne geçmemize de yardımcı olur.
Uygulama
Öncelikle veritabanı operasyonlarımızı temsil edecek bir interface oluşturuyoruz 👇
public interface IRepository<T> where T : class
{
T GetById(int id);
Task<T> GetByIdAsync(int id);
T Get(Expression<Func<T, bool>> expression);
Task<T> GetAsync(Expression<Func<T, bool>> expression);
IQueryable<T> GetAll();
IQueryable<T> GetAll(Expression<Func<T,bool>> expression);
void Update(T entity);
void Delete(T entity);
Task AddAsync(T entity);
}
IRepository
adıyla interface'imizi oluşturduk. Burada ortak olarak kullanılacak veritabanı operasyonlarını belirtiyoruz. Siz de istediğiniz ortak fonksiyonları burada belirtebilirsiniz. Şimdi de bu interface'i implement edecek Repository class'ımızı oluşturalım 👇
public class Repository<T>:IRepository<T> where T : class
{
protected readonly AppDbContext _context;
private readonly DbSet<T> _dbSet;
public Repository(AppDbContext context)
{
_context = context;
_dbSet = _context.Set<T>();
}
public async Task AddAsync(T entity)
{
await _dbSet.AddAsync(entity);
}
public async Task DeleteAsync(T entity)
{
_dbSet.Remove(entity);
}
public T Get(Expression<Func<T, bool>> expression)
{
return _dbSet.Where(expression).FirstOrDefault();
}
public IQueryable<T> GetAll()
{
return _dbSet.AsQueryable();
}
public IQueryable<T> GetAll(Expression<Func<T, bool>> expression)
{
return _dbSet.Where(expression).AsQueryable();
}
public async Task<T> GetAsync(Expression<Func<T, bool>> expression)
{
return await _dbSet.FirstOrDefaultAsync(expression);
}
public T GetById(int id)
{
return _dbSet.Find(id);
}
public async Task<T> GetByIdAsync(int id)
{
return await _dbSet.FindAsync(id);
}
public void Update(T entity)
{
_dbSet.Update(entity);
}
public void Delete(T entity)
{
_dbSet.Remove(entity);
}
}
Veritabanı operasyonlarımızı tanımladığımıza göre artık sadece bu operasyonları kullanmak kaldı. Controller içerisinde, dependency injection ile IRepository interface'ini çağıralım ve kullanalım.
public class WeatherForecastController : ControllerBase
{
private readonly IRepository<Product> _productRepository;
private readonly IRepository<WeatherForecast> _repository2;
[HttpGet(Name = "Get")]
public async Task<List<Product>> Get()
{
return _productRepository.GetAll().ToListAsync();
}
[HttpPost(Name = "Add")]
public async Task Add(Product model)
{
await _productRepository.AddAsync(model);
}
}
Yukarıda görüldüğü gibi istediğimiz entity için IRepository
çağırabiliriz. Bu sayede hazır olan veritabanı operasyonlarından istediğimizi kullanabiliriz. Bu repository'leri service classları ile de sarabiliriz.
Bazı arkadaşların; "Birader! 😡 Operasyonları yazdık ama veritabanına henüz gitmedi, değişiklikler kaydedilmedi. " dediğini duyar gibiyim.
![]() |
"O'da başka bir yazının konusu." |
Projenin kaynak dosyalarına buradan ulaşabilirsiniz.
Bu yazımda sizlere Repository Design Pattern ve ASP.NET CORE'da uygulanmasından bahsettim.
Sabırla okuduğunuz için teşekkür eder, bol kodlu günler dilerim 🤩