Apakah kita menggunakan pola repositori kan?

14

Kami menggunakan sekelompok kelas yang terpisah dengan akhiran -repositoryuntuk mengambil data dari database; untuk setiap tabel repositori sendiri.

Kami memiliki misalnya customerrepositorykelas yang memiliki semua jenis metode untuk mengambil pelanggan, dan vacancyrepositoryyang memiliki semua jenis metode untuk mengambil lowongan.

Saya punya dua pertanyaan tentang cara melakukan hal-hal ini:

  1. Bagaimana dengan mendapatkan data yang mencakup beberapa tabel? Misalnya saya memiliki layar yang menunjukkan semua pelanggan yang belum membuat lowongan. Bisakah customerrepositorymetode yang digunakan dari vacancyrespository, atau apakah kedua repositori mengembalikan hasil dan apakah ada kelas yang lebih tinggi dalam hierarki (sebut saja a dataservice) yang mendapatkan hasil dari kedua repositori dan menggabungkannya ke dalam 1 hasil?

  2. berapa banyak logika yang bisa ditangani oleh repositori seperti itu?
    Saya pikir tidak apa-apa untuk mengimplementasikan 'where active == true' dalam repositori untuk mengambil hanya rekaman yang aktif, atau haruskah logika sederhana itu ditangani oleh kelas yang lebih tinggi dalam hierarki (beri nama a dataservice)?

Contoh yang saya temui sekarang adalah yang ini:

Kami memiliki daftar pertanyaan, yang berisi satu atau lebih pertanyaan.
Pertanyaannya dapat memiliki hasil, yang disimpan dalam tabel terpisah.
Jadi, ketika Anda ingin mengambil hasil total dari daftar pertanyaan, Anda harus menggabungkan data dari questionlisttabel, tabel pertanyaan dan questionstatustabel.

Saat ini kami memiliki 3 repositori berbeda untuk tabel ini.

Jika saya akan bertanya questionlistrepositoryapa itu hasil total untuk daftar nomor 12, itu harus mendapatkan data dari dua repositori lain dan karenanya memiliki beberapa logika di dalamnya, apakah itu diperbolehkan?

Atau adakah questionlistdataserviceyang tahu repositori mana yang digunakan?

Satu hal lagi: repositori kami dapat menghasilkan IQueryablesehingga layanan panggilan dapat dengan mudah menggabungkan hasilnya, tetapi bagaimana ketika ini tidak terjadi, saya tidak berpikir itu ide yang baik untuk mengambil semua konten dari ketiga tabel dari basis data.

Michel
sumber
1
Biasanya dalam beberapa tabel diakses, tabel dominan ditentukan oleh tabel catatan yang harus ada sebelum kueri mengambilnya. Di LEFT OUTER JOIN, itu akan menjadi tabel pertama yang disebutkan dan di RIGHT OUTER JOIN, itu akan menjadi yang kedua.
Neil

Jawaban:

15

Repositori mengembalikan objek domain dan dibangun di atas lapisan pemetaan. Untuk domain yang sangat sederhana, objek domain dan tabel database bisa sangat mirip.

Jika repositori Anda selalu mengembalikan representasi tepat dari struktur data Anda maka itu mungkin sebenarnya Table Data Gateway alias Data Access Object (DAO).

Contoh: Basis data Anda memiliki tabel untuk orang dan alamat. Di alamat domain aplikasi Anda bukan entitas miliknya sendiri, itu hanya properti Person. Dalam hal ini Anda tidak akan memiliki PersonRepository dan AddressRepository. Anda hanya memiliki PersonRepository. Domain tidak perlu khawatir tentang bagaimana data domain bertahan. Tanggung jawab tersebut berada di lapisan di belakang repositori.

Dari contoh Anda tampaknya Anda benar-benar memiliki DAO dan baru saja menamainya Repositori.

simoraman
sumber
Jadi saat membuat repositori, saya juga dapat memiliki gateway data Tabel satu tingkat lebih dalam, dan repositori kami sebenarnya adalah TDG.
Michel
1
Anda bisa, tetapi pertimbangkan biaya dan manfaatnya. Jangan diganggu untuk menjaga DAO dan Repositori terpisah dengan prinsip kode "layering". Lakukan apa yang paling mudah dibaca dalam kasus ini. Pemisahan, dan lapisan abstraksi yang dihasilkan, mungkin berguna jika Repositori Anda cenderung melakukan banyak rekombinasi data dalam DAO.
Mihai Danila