Ana içeriğe geç

Repository Deseni

İngilizcesi
Repository Pattern
Okunuşu
ripozıtori petırn
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/repository-pattern

Kısaca

Repository deseni, veri erişimini koleksiyon benzeri bir arayüzün arkasına gizler; iş kodu nesnelerin nerede saklandığını bilmeden yükleyip kaydedebilir.

Repository deseni nedir?

Repository, gerçekte bir veritabanından, API'den ya da dosyalardan okuyup yazarken kullanıcılar veya siparişler gibi alan nesnelerinin bellek içi bir koleksiyonu gibi davranan bir nesnedir. İş kodu findById, save ve findOverdueInvoices gibi metotları çağırır; SQL'i, ORM çağrılarını ya da HTTP isteklerini perde arkasında repository yönetir. Desen, Martin Fowler tarafından 2000'lerin başında tanımlanmış ve domain-driven design'ın temel yapı taşlarından biri olmuştur.

Genellikle repository'yi iş katmanında bir arayüz olarak tanımlar ve bir ya da daha fazla uygulama yazarsınız: üretim için SQL veya ORM tabanlı olan ve hızlı testler için bellek içi olan. Metotlar veritabanının değil, alanın diliyle adlandırılır ve domain-driven design'da genellikle her tablo için değil, birlikte kaydedilen bir nesne kümesi olan her aggregate için bir repository bulunur. Clean ve hexagonal architecture'da repository arayüzü bir port, veritabanı uygulaması ise bir adaptördür.

Kütüphanenin danışma masası bir benzetmedir: bir kitabı adıyla istersiniz ve görevli, nerede saklandığını bilmenize gerek kalmadan onu raflardan, arşivden ya da başka bir şubeden getirir. Repository'ler, servislere sahte bir repository verilebildiği için kodu test etmeyi kolaylaştırır ve veritabanı ayrıntılarının iş mantığına yayılmasını önler.

Repository deseni sıklıkla DAO (data access object) ve ORM ile karıştırılır. DAO genellikle veritabanını yansıtır; her tablo için bir sınıf ve genel oluşturma, okuma, güncelleme ve silme metotları vardır. Repository ise alanın diliyle konuşur ve birkaç tabloyu birleştirebilir. ORM nesneleri tablolara eşler ve repository onu sarabilir, ancak birçok ORM zaten repository benzeri API'ler sunar; bu yüzden kendi katmanınızı eklemek ancak testi basitleştirdiğinde ya da gerçek karmaşıklığı gizlediğinde değerlidir. Ortak ada rağmen bir Git repository'siyle de hiçbir ilgisi yoktur.

Önemli noktalar

  • Repository, iş koduna nesneleri yüklemek ve kaydetmek için koleksiyon benzeri bir arayüz verir.
  • Metotları veritabanı terimleriyle değil, findOverdueInvoices gibi alan diliyle adlandırılır.
  • Üretim kodu bir veritabanı uygulaması kullanabilir, testler ise bellek içi bir uygulama.
  • Clean ve hexagonal architecture'da repository arayüzü bir porttur.
  • DAO genellikle tabloları yansıtır; repository alana göre şekillenir.

Örnek

Bellek içi uygulaması olan bir repository arayüzütypescript
interface User { id: string; email: string }

// The business layer depends only on this interface
interface UserRepository {
  findById(id: string): Promise<User | null>;
  save(user: User): Promise<void>;
}

// An in-memory implementation for tests (production would use SQL or an ORM)
class InMemoryUserRepository implements UserRepository {
  private users = new Map<string, User>();
  async findById(id: string) { return this.users.get(id) ?? null; }
  async save(user: User) { this.users.set(user.id, user); }
}

Sık sorulan sorular

Repository ile DAO arasındaki fark nedir?

DAO genellikle veritabanı yapısına bağlıdır; çoğunlukla her tablo için genel CRUD metotlarına sahip bir sınıftır. Repository ise alana bağlıdır: iş ihtiyaçlarına uyan metotlar sunar ve birkaç tablodaki veriyi tek bir nesnede birleştirebilir.

ORM kullanıyorsam repository desenine ihtiyacım var mı?

Her zaman değil. Birçok ORM zaten repository benzeri metotlar sunar ve bunları yeniden sarmak şablon kod ekleyebilir. Özel bir repository en çok alana özgü sorguları tek bir yerde toplamak, kolay test yedekleri (test double) kullanmak ya da veri kaynağını sonradan değiştirebilme özgürlüğü istediğinizde yararlıdır.

Repository ile servis arasındaki fark nedir?

Repository yalnızca nesneleri saklamaktan ve geri getirmekten sorumludur. Servis ise sipariş vermek gibi iş mantığını içerir ve üzerinde çalıştığı veriyi yüklemek ve kaydetmek için bir ya da daha fazla repository kullanır.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar