กำลังอ่านบทความบางอย่างเกี่ยวกับข้อดีของการสร้างแหล่งเก็บข้อมูลทั่วไปสำหรับแอปใหม่ ( ตัวอย่าง ) แนวคิดนี้ดูดีเพราะให้ฉันใช้พื้นที่เก็บข้อมูลเดียวกันเพื่อทำสิ่งต่าง ๆ สำหรับเอนทิตีที่แตกต่างกันหลายรายการพร้อมกัน:
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();
อย่างไรก็ตามการใช้งานส่วนที่เหลือของพื้นที่เก็บข้อมูลมีความเชื่อมั่นอย่างมากใน 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
รูปแบบพื้นที่เก็บข้อมูลนี้ใช้งานได้ดีเยี่ยมสำหรับ Entity Framework และมีการแมป 1 ถึง 1 ของวิธีการที่มีอยู่ใน DbContext / DbSet แต่ด้วยการที่ Linq ใช้งานช้าของเทคโนโลยีการเข้าถึงข้อมูลอื่น ๆ นอกเหนือจาก Entity Framework สิ่งนี้มีประโยชน์อะไรมากกว่าการทำงานโดยตรงกับ DbContext
ฉันพยายามเขียนRepositoryเวอร์ชันPetaPocoแต่ PetaPoco ไม่รองรับ Linq Expressions ซึ่งทำให้การสร้างอินเทอร์เฟซ IRepository ทั่วไปนั้นค่อนข้างไร้ประโยชน์เว้นแต่คุณจะใช้สำหรับพื้นฐาน GetAll, GetById, เพิ่ม, อัปเดต, ลบและบันทึก วิธีการและใช้มันเป็นคลาสฐาน จากนั้นคุณต้องสร้างแหล่งเก็บข้อมูลเฉพาะด้วยวิธีการเฉพาะเพื่อจัดการคำสั่ง "ที่" ทั้งหมดที่ฉันสามารถส่งผ่านเป็นเพรดิเคตได้
รูปแบบ Generic Repository มีประโยชน์สำหรับทุกอย่างที่อยู่นอก Entity Framework หรือไม่? ถ้าไม่ใช่ทำไมบางคนถึงใช้มันแทนการทำงานโดยตรงกับ Entity Framework?
ลิงค์เดิมไม่ได้สะท้อนรูปแบบที่ฉันใช้ในโค้ดตัวอย่างของฉัน นี่คือ ( ลิงก์ที่อัปเดต )