Depo Deseni Adım Adım Açıklama [kapalı]


276

Birisi bana adım adım çok basit bir örnek veya demo vererek, .NET'teki Depo Deseni'ni açıklayabilir mi?

Bunun çok yaygın bir soru olduğunu biliyorum ama şimdiye kadar tatmin edici bir cevap bulamadım.



1
Burada iyi bir yazı var: deviq.com/repository-pattern
ssmith

Yanıtlar:


199

Özet olarak, veri havuzu modelinin daha geniş etkisini tarif ederim. Tüm kodunuzun, nesnelerin nasıl kalıcı olduğunu bilmeden nesneleri kullanmasına izin verir. Tablolardan nesnelere eşleme de dahil olmak üzere tüm kalıcılık bilgisi depoda güvenli bir şekilde bulunur.

Çok sık, kod tabanına dağılmış SQL sorguları bulacaksınız ve bir tabloya bir sütun eklemek için geldiğinizde bir tablonun kullanımlarını bulmaya çalışmak için kod dosyalarını aramanız gerekir. Değişimin etkisi çok geniş.

Havuz deseniyle, yalnızca bir nesneyi ve bir havuzu değiştirmeniz gerekir. Etki çok küçük.

Belki de depo desenini neden kullanacağınızı düşünmenize yardımcı olabilir. İşte bazı nedenleri:

  • Veri erişiminizde değişiklik yapmak için tek bir yeriniz var

  • Bir dizi tablodan sorumlu tek bir yeriniz var (genellikle)

  • Bir depoyu test için sahte bir uygulama ile değiştirmek kolaydır - bu nedenle birim testleriniz için kullanılabilir bir veritabanınızın olması gerekmez

Mesela MySQL kullanıyorsanız ve SQL Server'a geçmek istiyorsanız başka faydalar da var - ama aslında bunu pratikte hiç görmedim!


28
RE dbms a b geçiş, ben sadece bunu gördüm değil, ben üretim kodunda bunu kaydettim. Daha önce Oracle kullanıyorduk, barındırma sağlayıcısını değiştirmek zorunda kaldık, Azure'a yerleştik (Oracle'ı desteklemeden önce), bu yüzden SQL Azure'a dönüştürmek zorunda kaldık. Ne yazık ki, bu noktada tüm veri erişim mantığını ayırmadık, ama kesinlikle bu taşımayı yaptığımız gibi yaptık (ve ileriye ekleyebilirim).
Joe

5
Bu yorumun eski ve konu dışı olduğunu biliyorum, ancak bunu birden fazla şirkette yaptım. Tipik olarak, bir ORM'ye doğru veya ORM'den uzaklaşmak için bir sürecin bir parçasıdır. Depo, özellikle onları soyut bir fabrika modelinden yüklerseniz veya bir IoC kabı kullanırsanız, bu anahtarın kapatılmasını kolaylaştırır.
Derek Van Cuyk

Aslında depo veri kaynağı ile ilgili işlemler için DAO kullanıyor ...
Yousha Aleayoub

1
@YoushaAleayoub ki iyi bir noktaya değindin. Kullanıcılar "veritabanını ayırmaya" çalıştığında Veri Erişimi Nesneleri'ni ve "sorgudan tek bir şeyi sorumlu tutmaya" çalıştığında depoları genellikle bulacaksınız. Hemen hemen her durumda, ikisini birlikte bulacaksınız. DAO parçasıdır IConnection, ICommandvb parçası olduğunu gizler veritabanının türü. Depo genellikle daha etki alanı merkezlidir.
Fenton

181

Bu güzel bir örnek: C # 'da Depo Desen Örneği

Temel olarak, depo, verinin veritabanından / veritabanına tam olarak nasıl alındığını / kalıcı olarak saklandığının ayrıntılarını gizler. Kapakların altında:

  • okumak için, sağlanan ölçütleri karşılayan bir sorgu oluşturur ve sonuç kümesini döndürür
  • yazmak için, temel sebat motorunun (örneğin bir SQL veritabanı) verileri kaydetmesini sağlamak için gerekli komutları yayınlar

13
Bu örnek şimdiye kadarki en iyi açıklama, MSDN belgelerinden daha iyi.
Teoman shipahi

2
Bulduğum bu çok iyi. Ayrıca, Veri
Modeli'nin

8
Bağlantılı örnek, havuz paterni hatasıdır. Entity Framework ( IDbContext) veya ISessiondoğrudan nhibernate ( ) tarafından sağlanan arayüzlerin kullanımıyla karşılaştırıldığında hiçbir avantaj sağlamaz . Doğru şekilde uygulanan bir depo TÜM kalıcılığa özgü bilgileri (mevcut Linq To Sql sağlayıcısının nasıl çalıştığı gibi) soyutlar. yani asla ifşa etmeyin IQueryable.
jgauffin

3
@jgauffin IQueryablekalıcılığa özgü bir bilgi değildir. IQueryable'ın desteği sabit kodlanmış bir dizi kadar basit olabilir veya bir XML dosyası, web hizmeti, veritabanı, düz dosya vb. Olabilir. her durumda yavaş veri erişimine yol açar, burada IQueryable'ın ortaya çıkarılması, bazı durumlarda kalıcılık deposu bu özelliğe sahipse uygulanabilir olduğunda performans geliştirmeleri yapılmasına izin verir. Ayrıca, DbContext'i gizlemek gerekirse (veya ORM yok!) Farklı bir ORM'ye geçmenizi sağlar
Robert McKee

5
Kalıcılık bilgisine özgü bilgi sızdırıyor. INBelirli LinqToSql sağlayıcısının bunu nasıl yaptığını bilmeden istekli / tembel yükleme veya bir sql yan tümcesi oluşturmayı deneyin .
jgauffin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.