Saya baru-baru ini membaca banyak argumen yang menentang penggunaan pola repositori dengan ORM seperti Entity Framework yang kuat karena menggabungkan fungsionalitas seperti repositori, bersama dengan fungsionalitas Unit Kerja juga.
Argumen lain yang menentang penggunaan pola untuk situasi seperti pengujian unit adalah bahwa pola repositori adalah abstraksi yang bocor karena implementasi yang lebih umum meningkatkan IQueryable.
Argumen yang menentang penggunaan pola repositori masuk akal bagi saya, tetapi metode alternatif abstraksi yang disarankan seringkali lebih membingungkan dan tampak sama sulitnya dengan masalahnya.
Solusi Jimmy Bogards tampaknya adalah campuran meniup abstraksi, tetapi juga memperkenalkan arsitekturnya sendiri. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repository/
Contoh lain dari repositori yang tidak perlu .... tetapi gunakan arsitektur saya! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Lain ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Saya belum menemukan pengganti yang jelas atau alternatif dari pendekatan pola repositori "terlalu rumit" yang tidak lebih dirancang sendiri.
sumber
Jawaban:
Saya pikir Anda menggabungkan repositori dan repositori generik.
Repositori dasar hanya antarmuka penyimpanan data Anda dan menyediakan metode untuk mengembalikan data
Itu tidak membocorkan lapisan data ke dalam kode Anda melalui IQueryable atau cara-cara lain untuk mengirimkan pertanyaan acak dan memberikan permukaan metode yang dapat diuji dan disuntikkan dengan baik.
Repositori Generik memungkinkan Anda untuk mengirimkan pertanyaan seperti ORM
Saya setuju tidak ada gunanya menggunakan Repositori Generik di atas ORM yang pada dasarnya hanyalah Repositori Generik.
Jawabannya adalah menggunakan pola Repositori dasar untuk menyembunyikan ORM Anda
sumber
Sebagian besar argumen yang Anda sebutkan salah atribut ke fitur pola Repositori yang tidak dimiliki.
Secara konseptual, Repositori sebagaimana didefinisikan sebelumnya dalam DDD hanyalah kumpulan objek yang dapat Anda cari atau tambahkan. Mekanisme ketekunan di baliknya disarikan, sehingga sebagai konsumen Anda mendapat ilusi bahwa itu adalah koleksi di dalam memori.
Implementasi Repositori yang memiliki abstraksi yang bocor (mengekspos
IQueryables
misalnya) adalah implementasi Repositori yang buruk.Implementasi Repositori yang mengekspos lebih dari sekedar operasi pengumpulan (misalnya, fitur Unit Kerja) adalah implementasi Repositori yang buruk.
Apakah ada alternatif untuk Repositori untuk akses data? Ya, tetapi itu tidak terkait dengan masalah yang Anda kemukakan dalam pertanyaan Anda.
sumber
Bagi saya, repositori, dikombinasikan dengan ORM atau lapisan ketekunan DB lainnya, memiliki kelemahan ini:
Seperti:
4. Objek Bahaya Tuhan: Anda mungkin tergoda untuk membuat satu kelas dewa, yang mencakup semua model atau lapisan akses data Anda. Kelas repositori tidak hanya berisi metode Mobil, tetapi metode untuk semua entitas.
Menurut pendapat saya, lebih baik menawarkan setidaknya beberapa peluang permintaan, untuk menghindari kekacauan besar dari banyak metode tujuan tunggal. Tidak masalah apakah itu LINQ, bahasa permintaan sendiri, atau bahkan sesuatu yang diambil langsung dari ORM (OK, semacam masalah kopling ...).
sumber
Jika tujuan dari antarmuka-Repositori adalah untuk mengejek basis data untuk unittest (= test in isolation) abstraksi terbaik adalah sesuatu yang mudah untuk diejek.
Sulit untuk mengejek antarmuka repositori yang didasarkan pada hasil IQueryable.
Dari sudut pandang Unit-testing
dapat diejek dengan mudah
dapat diejek dengan mudah hanya jika tiruan mengabaikan konten dari parameter kueri.
tidak bisa dengan mudah diejek
sumber
Saya tidak berpikir pola repositori berlebihan, jika Anda menggunakan fungsi lambda untuk query. Terutama ketika Anda harus mengabstraksi ORM (menurut saya Anda selalu harus) maka saya tidak akan peduli dengan detail implementasi repositori itu sendiri.
Sebagai contoh:
sumber