Apakah Repositori diperlukan lagi di ASP.net 5 & EF7?

9

Saya memposting pertanyaan di github ke Tim EF. Saya mendapat jawaban yang mengatakan akan lebih baik untuk mengajukan pertanyaan ini di sini sehingga saya akan menyalin dan menempelnya di sini karena kami sebagai tautan sehingga orang lain dapat melihat beberapa balasan di GitHub.

Pertanyaan: Saya sedang melakukan penelitian dan seseorang menunjukkan bahwa Baris 24 dari Kelas DBContext menyatakan

DbContext adalah kombinasi dari Pola Unit Kerja dan Repositori.

Apakah ini berarti bahwa kita tidak perlu lagi mengabstraksi EF ke Repositori lalu menggunakan dan Interface untuk menyuntikkannya ke Pengontrol?

Posting asli di Github: https://github.com/aspnet/EntityFramework/issues/4899

Alasan saya menanyakan hal ini adalah sepertinya saya masuk ke suatu tempat di mana saya menambahkan banyak metode ke repositori seperti GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, dll. Dan sepertinya itu akan mengotori repo di pikiran saya.

Loren.Dorez
sumber
1
Apa pendapat Anda tentang jawaban yang diberikan rowanmiller? Tampaknya masuk akal bagi saya.
Robert Harvey
@RobertHarvey Ya itu jawaban yang bagus tetapi saya ingin melihat bagaimana perasaan orang lain tentang topik tersebut sebelum saya membuat keputusan untuk repositori atau tidak
Loren.Dorez
lihat juga lostechies.com/jimmybogard/2009/09/11/wither-the-repository di mana Bogard berpendapat hal yang sama.
mcknz
Saya mengerti mengapa EF (dan ORM lainnya) bukan repositori .
Eric King
Repositori tidak akan memiliki metode seperti GetWithIncludesABC. Pola repositori adalah abstraksi, pada dasarnya, tabel database sebagai koleksi. Biasanya, dimungkinkan untuk meminta koleksi (misalnya oleh LINQ), dan repositori kemudian mengubah permintaan menjadi SQL. Apa yang Anda bicarakan terdengar seperti Gateway Data.
Mr Cochese

Jawaban:

12

Jika Anda menambahkan metode ke repositori seperti

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Maka Anda lebih baik pindah ke Lapisan Layanan, dan membiarkan Lapisan Layanan menggunakan EF secara langsung. EF telah memiliki fungsionalitas yang mirip dengan metode di atas yang Anda duplikasi tanpa akhir.

Lapisan Layanan memperlihatkan metode Domain Bisnis, dan menggunakan CRUD untuk mengimplementasikannya. Misalnya, Anda mungkin memiliki metode yang disebut TransferMoney(A, B), di mana A dan B sedang memeriksa akun. Ini memungkinkan Anda untuk berbicara dalam bahasa domain bisnis Anda, sementara Layer Layanan menangani CRUD untuk Anda.

Satu-satunya alasan kuat yang dapat saya pikirkan di mana Anda mungkin ingin memiliki Lapisan Repositori yang terpisah adalah agar Anda dapat mengejek lapisan repositori itu atau mengganti sumber data yang berbeda untuk tujuan pengujian.

Robert Harvey
sumber
Namun Anda dapat mengejek dbset ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot
4

Robert Harvey mengatakan dalam jawabannya:

Satu-satunya alasan kuat yang dapat saya pikirkan di mana Anda mungkin ingin memiliki Lapisan Repositori yang terpisah adalah agar Anda dapat mengejek lapisan repositori itu atau mengganti sumber data yang berbeda untuk tujuan pengujian.

Inilah mengapa Pola Repositori masih relevan. Saya juga tidak setuju dengan pernyataan tim Kerangka Kerja Entitas bahwa mereka menerapkan Pola Repositori. Entity Framework masih sangat terikat dengan database. Seluruh tujuan Pola Repositori adalah untuk memisahkan dan mengabstraksi mekanisme ketekunan yang tepat digunakan dalam aplikasi Anda, sehingga tidak ada yang dari implementasi kebocoran akses data di luar lapisan repositori.

Jika Anda menggunakan API kueri EF di luar "repositori," seperti dalam objek layanan, saya akan mengatakan Anda melanggar polanya.

Sekarang, jika itu bukan masalah besar bagi database seperti fungsionalitas untuk bocor ke kode Anda yang lain, dan Anda dapat menjamin bahwa Anda tidak perlu memindahkan beberapa operasi CRUD Anda ke layanan web di masa depan, maka menggunakan EF secara langsung akan menjadi BAIK.

Pada dasarnya, Entity Framework menggantikan objek Gateway dalam Pola Repositori. Saya tidak melihatnya sebagai repositori itu sendiri.

Greg Burghardt
sumber
Apa bedanya Repositori dengan aspek Lapisan Layanan? dari apa yang dapat saya temukan jika saya mengembalikan IQueryable maka pada dasarnya saya adalah sebuah Repositori jika saya mengembalikan IEnumerable kemudian saya menggunakan lapisan layanan. Apakah ini benar? Apakah Pola Lapisan Layanan dan Repositori Mirip?
Loren.Dorez
@ Loren.Dorez: Lapisan Layanan memiliki metode khusus untuk Domain Bisnis, seperti TransferFunds()dan BuildWidget(). Repositori hanya berisi metode CRUD.
Robert Harvey
Jadi, baik Layer Layanan dan Repositori akan langsung mengakses DBContext? Jadi, Anda akan menempatkan CRUD di Repo dan Get Methods dan metode lain di Layer Layanan? Apakah saya mengerti ini dengan benar?
Loren.Dorez
Lapisan Layanan dapat mengakses Repositori, jika Anda memilikinya, bukan EF secara langsung.
Robert Harvey
@RobertHarvey Bisakah Anda tunjukkan contoh menggunakan Get Methds di atas? Seperti sekarang saya agak bingung maaf.
Loren.Dorez