Pola Repositori Langkah demi Langkah Penjelasan [ditutup]

276

Dapatkah seseorang tolong jelaskan kepada saya Pola Repositori di .NET, langkah demi langkah memberikan contoh atau demo yang sangat sederhana.

Saya tahu ini adalah pertanyaan yang sangat umum tetapi sejauh ini saya belum menemukan jawaban yang memuaskan.

Sa Patil
sumber

Jawaban:

199

Sebagai ringkasan, saya akan menjelaskan dampak yang lebih luas dari pola repositori. Ini memungkinkan semua kode Anda untuk menggunakan objek tanpa harus tahu bagaimana objek tersebut bertahan. Semua pengetahuan tentang kegigihan, termasuk pemetaan dari tabel ke objek, terkandung dengan aman di repositori.

Sangat sering, Anda akan menemukan query SQL yang tersebar di basis kode dan ketika Anda datang untuk menambahkan kolom ke tabel Anda harus mencari file kode untuk mencoba dan menemukan penggunaan tabel. Dampak dari perubahan itu sangat luas.

Dengan pola repositori, Anda hanya perlu mengubah satu objek dan satu repositori. Dampaknya sangat kecil.

Mungkin akan membantu untuk memikirkan mengapa Anda akan menggunakan pola repositori. Berikut beberapa alasannya:

  • Anda memiliki satu tempat untuk membuat perubahan pada akses data Anda

  • Anda memiliki satu tempat yang bertanggung jawab untuk satu set tabel (biasanya)

  • Sangat mudah untuk mengganti repositori dengan implementasi palsu untuk pengujian - jadi Anda tidak perlu memiliki database yang tersedia untuk pengujian unit Anda

Ada manfaat lain juga, misalnya, jika Anda menggunakan MySQL dan ingin beralih ke SQL Server - tetapi saya belum pernah benar-benar melihat ini dalam praktek!

Fenton
sumber
28
RE beralih dari dbms a ke b, saya akan merekam bahwa tidak hanya saya telah melihat ini, saya sudah melakukan ini dalam kode produksi. Kami sebelumnya menggunakan Oracle, harus beralih penyedia hosting, menetap di Azure (sebelum mereka mendukung Oracle), jadi kami harus mengonversi ke SQL Azure. Sayangnya, kami belum memisahkan semua logika akses data pada saat itu, tetapi kami tentu saja melakukannya saat kami melakukan migrasi itu (dan selanjutnya, saya mungkin menambahkan).
Joe
5
Saya tahu komentar ini sudah lama dan ditutup sebagai di luar topik, tetapi saya telah melihat ini dilakukan di banyak perusahaan. Biasanya, ini adalah bagian dari proses untuk bergerak menuju atau menjauh dari ORM. Repositori membuatnya lebih mudah untuk mematikannya, terutama jika Anda memuatnya dari pola pabrik abstrak atau menggunakan wadah IoC.
Derek Van Cuyk
Sebenarnya Repositori menggunakan DAO untuk operasi terkait sumber data ...
Yousha Aleayoub
1
@YoushaAleayoub poin bagus yang Anda angkat. Anda biasanya akan menemukan Objek Akses Data ketika orang mencoba untuk "memisahkan database" dan repositori ketika orang mencoba untuk "membuat satu hal yang bertanggung jawab atas permintaan". Dalam hampir semua kasus, Anda akan menemukan keduanya bersama-sama. Bagian DAO adalah IConnection, ICommand, dll bagian yang menyembunyikan jenis database. Repositori biasanya lebih berfokus pada domain.
Fenton
181

Ini adalah contoh yang bagus: Contoh Pola Repositori di C #

Pada dasarnya, repositori menyembunyikan rincian tentang bagaimana tepatnya data diambil / dipertahankan dari / ke database. Di bawah selimut:

  • untuk membaca, ini menciptakan kueri yang memenuhi kriteria yang disediakan dan mengembalikan set hasil
  • untuk menulis, ini mengeluarkan perintah yang diperlukan untuk membuat mesin persistensi yang mendasarinya (misalnya database SQL) menyimpan data
twoflower
sumber
13
Contoh ini adalah penjelasan terbaik yang pernah ada, hanya lebih baik daripada dokumentasi MSDN.
Teoman shipahi
2
Saya menemukan ini sangat bagus. Ini juga memberikan penjelasan yang layak tentang Unit Kerja, yang tampaknya merupakan bentuk yang lebih umum dari Pola Data atas Pola Repositori
Celdor
8
Contoh yang ditautkan adalah kegagalan pola repositori. Ini tidak memberikan keuntungan sama sekali dibandingkan dengan menggunakan antarmuka yang disediakan oleh Entity Framework ( IDbContext) atau di nhibernate ( ISession) secara langsung. Sebuah repositori yang diimplementasikan dengan benar menghilangkan SEMUA informasi spesifik persistensi (seperti cara kerja penyedia Linq To Sql saat ini). yaitu tidak pernah mengekspos IQueryable.
jgauffin
3
@ jgauffin IQueryablebukan informasi spesifik kegigihan. Dukungan dari IQueryable dapat sesederhana array kode keras, atau bisa dari file XML, layanan web, database, file datar, dll. Saya tidak akan merekomendasikan repositori yang tidak mengekspos IQueryable seperti biasa menyebabkan akses data yang lambat dalam setiap kasus, di mana mengekspos IQueryable akan memungkinkan beberapa contoh untuk melakukan peningkatan kinerja jika berlaku jika toko kegigihan memiliki kemampuan itu. Selain itu, menyembunyikan DbContext memungkinkan Anda untuk beralih ke ORM yang berbeda jika perlu (atau tidak ORM!)
Robert McKee
5
Itu bocor informasi khusus informasi ketekunan. Cobalah untuk menggunakan pemuatan bersemangat / malas atau membangun INklausa sql tanpa mengetahui bagaimana penyedia LinqToSql tertentu melakukannya.
jgauffin