Sedang membaca beberapa artikel tentang keuntungan membuat Gudang Umum untuk aplikasi baru ( contoh ). Idenya tampak bagus karena memungkinkan saya menggunakan repositori yang sama untuk melakukan beberapa hal untuk beberapa tipe entitas yang berbeda sekaligus:
IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();
Namun, sisa implementasi dari Repository memiliki ketergantungan yang kuat pada Linq:
IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on
Pola repositori ini bekerja sangat baik untuk Entity Framework, dan cukup banyak menawarkan pemetaan metode 1 ke 1 yang tersedia di DbContext / DbSet. Tetapi mengingat penyerapan Linq yang lambat pada teknologi akses data lainnya di luar Entity Framework, apa keuntungan yang diberikan ini daripada bekerja langsung dengan DbContext?
Saya mencoba untuk menulis versi PetaPoco dari Repositori, tetapi PetaPoco tidak mendukung Linq Expressions, yang membuat membuat antarmuka IRepository generik sangat tidak berguna kecuali Anda hanya menggunakannya untuk GetAll, GetById, Add, Update, Delete, dan Save dasar metode dan menggunakannya sebagai kelas dasar. Maka Anda harus membuat repositori spesifik dengan metode khusus untuk menangani semua klausa "di mana" yang sebelumnya bisa saya sampaikan sebagai predikat.
Apakah pola Gudang Generik berguna untuk apa pun di luar Kerangka Entitas? Jika tidak, mengapa seseorang menggunakannya sama sekali alih-alih bekerja langsung dengan Entity Framework?
Tautan asli tidak mencerminkan pola yang saya gunakan dalam kode sampel saya. Ini adalah ( tautan yang diperbarui ).