1) Apa yang Anda lakukan jika Anda ingin keluar dari ORM, Anda akan memiliki kode ORM spesifik dalam aplikasi Anda jika Anda tidak memuatnya dalam repositori.
Saya belum dalam posisi di mana perusahaan tiba-tiba memutuskan untuk beralih teknologi akses data. Jika ini terjadi, beberapa pekerjaan akan diperlukan. Saya cenderung abstrak operasi akses data melalui antarmuka. Repositori adalah salah satu cara untuk menyelesaikan ini.
Saya kemudian akan memiliki majelis berbeda untuk implementasi konkret dari lapisan akses data saya. Misalnya, saya mungkin punya:
Company.Product.Data
dan Company.Product.Data.EntityFramework
majelis. Perakitan pertama akan digunakan sepenuhnya untuk antarmuka, ketika yang lain akan menjadi implementasi konkret dari logika akses data Entity Framework.
2) Apakah pola repositori masih valid ketika tidak menggunakan ORM dan Anda menggunakan ADO.net untuk mengakses data dan mengisi sendiri data objek?
Saya pikir itu terserah Anda untuk memutuskan pola mana yang valid atau tidak. Saya telah menggunakan pola repositori di lapisan presentasi. Satu hal yang perlu diingat adalah bahwa orang suka membuang tanggung jawab ke dalam repositori. Sebelum Anda menyadarinya, kelas repositori Anda akan menari, menyanyi dan melakukan semua hal. Anda ingin menghindari ini.
Saya telah melihat kelas repositori yang dimulai dengan memiliki tanggung jawab GetAll, GetById, Update, dan Delete, yang tidak masalah. Pada saat proyek selesai, kelas yang sama memiliki banyak metode (tanggung jawab) yang seharusnya tidak pernah ada. Misalnya GetByForename, GetBySurname, UpdateWithExclusions, dan segala macam hal gila.
Di sinilah kueri dan perintah berperan.
3) Jika Anda menggunakan ORM tetapi bukan pola repositori di mana Anda menyimpan kueri yang biasa digunakan. Apakah bijaksana untuk mewakili setiap permintaan sebagai kelas dan memiliki semacam pabrik permintaan untuk membuat instance?
Saya pikir itu ide yang sangat bagus untuk menggunakan kueri dan perintah alih-alih repositori. Saya melakukan hal berikut:
Tetapkan antarmuka untuk kueri. Ini akan membantu Anda menguji unit. Misalnyapublic interface IGetProductsByCategoryQuery { ... }
Tetapkan implementasi konkret untuk kueri. Anda akan dapat menyuntikkan ini melalui kerangka kerja IoC pilihan Anda. Misalnyapublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Sekarang alih-alih mencemari repositori dengan banyak tanggung jawab, saya hanya mengelompokkan pertanyaan saya ke dalam ruang nama. Misalnya, antarmuka untuk kueri di atas dapat hidup di:Company.SolutionName.Products.Queries
dan implementasinya dapat hidupCompany.SolutionName.Products.Queries.Implementation
Ketika datang untuk memperbarui atau menghapus data, saya menggunakan pola perintah dengan cara yang sama.
Beberapa mungkin tidak setuju dan mengatakan bahwa sebelum proyek selesai Anda akan memiliki lusinan kelas dan ruang nama. Ya kamu akan. Dalam pikiran saya itu adalah hal yang baik karena Anda dapat menelusuri solusi dalam IDE pilihan Anda dan langsung melihat tanggung jawab apa yang dimiliki komponen tertentu. Jika Anda telah memutuskan untuk menggunakan pola repositori sebagai gantinya, Anda harus melihat ke dalam masing-masing kelas repositori mencoba mencari tahu tanggung jawabnya.