crazy_coder
Moderatör
- Katılım
- 20 Şub 2026
- Mesajlar
- 204
- Tepkime puanı
- 0
- Puanları
- 16
Repository Pattern: Veri Erişimini Soyutlama ve Standartlaştırma
Repository Pattern, veritabanı ile iş mantığı (Business Logic) arasında bir arabulucu görevi görür. Temel amacı, veri kaynağına erişim kodlarını tek bir yerden yönetmek ve bu kodları uygulamanın diğer katmanlarından gizlemektir.
1. Neden Repository Pattern Kullanmalıyız?
[]Kod Tekrarını Önler: Aynı sorguyu (örneğin "Aktif Üyeleri Getir") projenin beş farklı yerinde yazmak yerine, Repository içinde bir kez yazıp her yerden çağırırsınız.
[]Test Edilebilirlik:** Gerçek veritabanı yerine "Sahte (Mock) Repository" kullanarak iş mantığınızı kolayca test edebilirsiniz.
[]Teknoloji Bağımsızlığı:** Yarın bir gün Entity Framework'ten Dapper'a geçmek isterseniz, sadece Repository katmanını değiştirmeniz yeterli olur; Controller kodlarınıza dokunmazsınız.
[]Merkezi Yönetim:** Veri filtreleme, sıralama veya cache (önbellek) gibi işlemleri tek bir noktada halledebilirsiniz.
2. Generic Repository: Her Tablo İçin Tek Bir Yapı
Her tablo için (Urun, Kategori, Musteri) ayrı ayrı "Ekle, Sil, Güncelle" metotları yazmak yerine, genel bir Generic Repository oluştururuz.
C#:
public interface IRepository<T> where T : class
{
Task<IEnumerable<T>> GetAllAsync();
Task<T> GetByIdAsync(int id);
Task AddAsync(T entity);
void Update(T entity);
void Delete(T entity);
}
3. Uygulama: EF Core ile Repository
Şimdi bu arayüzü (interface) somut bir sınıfla hayata geçirelim:
C#:
public class Repository<T> : IRepository<T> where T : class
{
protected readonly DbContext _context;
private readonly DbSet<T> _dbSet;
public Repository(DbContext context)
{
_context = context;
_dbSet = _context.Set<T>();
}
public async Task<T> GetByIdAsync(int id) => await _dbSet.FindAsync(id);
public async Task AddAsync(T entity) => await _dbSet.AddAsync(entity);
// Diğer metotlar...
}
4. Repository vs Unit of Work
Repository deseni genellikle Unit of Work (İş Birimi) deseni ile beraber kullanılır. Repository "ne yapılacağını" (Ekle, Sil), Unit of Work ise "ne zaman kaydedileceğini" (SaveChanges) belirler. Bu sayede birden fazla tablodaki işlem tek bir transaction (işlem) içinde güvenle tamamlanır.
| Özellik | Repository Kullanmadan | Repository Kullanarak |
|---|---|---|
| Bağımlılık | Controller veritabanına sıkı bağlıdır. | Controller sadece arayüze (Interface) bağlıdır. |
| Kod Tekrarı | Sorgular her yere dağılmıştır. | Sorgular tek bir sınıftadır. |
| Bakım | Zor ve risklidir. | Kolay ve güvenlidir. |
Sonuç
Repository Pattern, "Enterprise" (Kurumsal) seviyedeki uygulamaların temel taşıdır. Kodunuzu daha temiz, daha sürdürülebilir ve daha profesyonel kılar. Eğer küçük bir proje yapmıyorsanız, veri erişim katmanınızı mutlaka bu desenle organize etmelisiniz.