Apa yang seharusnya dilakukan oleh repositori?

15

Saya telah mendengar banyak pola repositori, tetapi saya tidak mengerti apa yang harus dilakukan repositori. Ketika saya mengatakan "repositori apa yang benar-benar harus dilakukan" saya terutama khawatir tentang metode apa yang harus disediakan. Misalnya, apakah repositori benar-benar menyediakan metode CRUD, atau haruskah menyediakan beberapa jenis metode yang berbeda?

Maksud saya, haruskah repositori berisi logika bisnis, atau haruskah hanya berisi logika untuk berkomunikasi dengan penyimpanan data dan mengelola entitas yang akan disimpan atau dimuat?

Saya juga pernah mendengar bahwa repositori adalah unit kegigihan untuk kelompok unsur kehidupan. Tapi bagaimana itu? Saya gagal memahami bagaimana ini bekerja dalam prakteknya. Saya berpikir bahwa kita harus memiliki hanya satu antarmuka IRepositoryyang berisi metode CRUD, dan kemudian untuk entitas apa pun implementasinya hanya akan berisi logika untuk menyimpan dan mengambil jenis seperti itu dari penyimpanan data.

pengguna1620696
sumber
4
"seandainya repositori berisi logika bisnis" - tidak.
ozz
1
Inilah jawaban saya untuk pertanyaan terkait pada SO
Eric King
2
Saya pikir Anda terjebak pada kata "harus" - repositori adalah pola tertentu, Anda berbicara seolah-olah ada cara repo yang harus dilakukan itu adalah cara terbaik untuk melakukan repo; ini adalah kesalahpahaman karena hanya ada satu cara untuk melakukan repo, apa pun tidak akan menjadi repo. Dengan demikian pola repo memiliki kekuatan dan kelemahan, tetapi tidak ada banyak pendekatan untuk repo. Ada yang Namun beberapa cara untuk berinteraksi dengan data, yang repo hanya satu. Baca di sini untuk beberapa pendekatan interaksi data lainnya
Jimmy Hoffa

Jawaban:

13

Nah, Anda dapat melihat contoh yang baik dalam Kerangka Kerja Data Spring yang didasarkan pada konsep repositori.

Di sana Anda akan melihat repositori hanya berurusan dengan penyimpanan data, dan jarang mengandung logika bisnis (ini dicadangkan untuk lapisan layanan). Jadi, misalnya, Anda melihat desain mereka, Anda akan melihat mereka memiliki antarmuka CRUDRepository yang memperlihatkan metode untuk membuat, menghancurkan dan memulihkan entitas (antara lain). Ada juga PagingAndSortingRepository yang menambahkan fungsionalitas ekstra untuk itu, menyortir dan mem -paging hasil, dll, dll.

Jadi, kerangka kerja ini mungkin merupakan tempat yang baik untuk mempelajari desain repositori yang baik.

Sejauh yang saya tahu, banyak konsep yang diterapkan oleh Spring Data Framework, berasal dari sebuah buku hebat yang disebut Domain-Driven Design: Tackling Complexity di Jantung Perangkat Lunak , buku ini memiliki seluruh bagian yang didedikasikan untuk desain Repositori.

Anda dapat mempertimbangkan untuk mendapatkan salinannya.

Kutipan kecil dari buku ini menjelaskan:

Pola REPOSITORY adalah kerangka kerja konseptual sederhana untuk merangkum solusi-solusi tersebut dan mengembalikan fokus model kami.

REPOSITORY mewakili semua objek dari jenis tertentu sebagai set konseptual (biasanya ditiru). Kerjanya seperti koleksi, kecuali dengan kemampuan kueri yang lebih rumit. Objek dengan tipe yang sesuai ditambahkan dan dihapus, dan mesin di belakang REPOSITORY memasukkannya atau menghapusnya dari database. Definisi ini mengumpulkan seperangkat tanggung jawab yang kohesif untuk menyediakan akses ke akar AGREGAT dari siklus kehidupan awal hingga akhir.

Klien meminta objek dari REPOSITORY menggunakan metode kueri yang memilih objek berdasarkan kriteria yang ditentukan oleh klien, biasanya nilai atribut tertentu. REPOSITORY mengambil objek yang diminta, merangkum mesin query database dan pemetaan metadata. REPOSITORI dapat mengimplementasikan berbagai kueri yang memilih objek berdasarkan kriteria apa pun yang dibutuhkan klien. Mereka juga dapat mengembalikan informasi ringkasan, seperti hitungan berapa banyak instance yang memenuhi beberapa kriteria. Mereka bahkan dapat mengembalikan perhitungan ringkasan, seperti total di semua objek yang cocok dari beberapa atribut numerik.

REPOSITORY mengangkat beban yang sangat besar dari klien, yang sekarang dapat berbicara dengan antarmuka yang sederhana dan mengungkap maksud, dan menanyakan apa yang dibutuhkan dalam hal model. Untuk mendukung semua ini membutuhkan banyak infrastruktur teknis yang kompleks, tetapi antarmuka yang sederhana dan terhubung secara konseptual ke model domain.

Karena itu:

Untuk setiap jenis objek yang membutuhkan akses global, buat sebuah objek yang dapat memberikan ilusi koleksi semua-jenis dari memori dalam memori. Atur akses melalui antarmuka global yang terkenal.

Berikan metode untuk menambah dan menghapus objek, yang akan merangkum penyisipan aktual atau penghapusan data di penyimpanan data. Memberikan metode yang memilih objek berdasarkan beberapa kriteria dan mengembalikan objek yang sepenuhnya instantiated atau koleksi objek yang nilai atributnya memenuhi kriteria, sehingga merangkum teknologi penyimpanan dan permintaan yang sebenarnya. Berikan REPOSITORI hanya untuk akar AGGREGATE yang sebenarnya membutuhkan akses langsung. Biarkan klien fokus pada model, mendelegasikan semua penyimpanan objek dan akses ke REPOSITORI.

edalorzo
sumber
4

Seharusnya tidak menyediakan antarmuka CRUD lurus atau logika bisnis. Ini memediasi antara logika bisnis dan database. Antarmuka harus dalam istilah logika bisnis tetapi tidak menjalankan logika bisnis itu sendiri, lebih seperti logika bisnis primitif. Sebagai contoh katakanlah Anda akan membangun sistem email, Anda memiliki pengguna dan pesan. Repositori Anda akan memberikan operasi CRUD dasar untuk pengguna dan pesan tetapi juga akan memberikan tampilan pesan yang disaring seperti GetUsersNewMessages (pengguna) atau GetSearchedMessages (pengguna, searchTerm).

Idenya adalah Repositori menyembunyikan bagaimana penyimpanan diimplementasikan dan menyediakan antarmuka yang bersih yang memungkinkan akses cepat dan fleksibel ke data. Menjaga operasi dalam tingkat tinggi tentang apa yang harus terjadi daripada bagaimana Anda memiliki lebih banyak fleksibilitas untuk mengimplementasikannya dengan cara apa pun yang terbaik untuk toko dukungan yang mendasarinya.

stonemetal
sumber