ฉันเคยดูเรื่องนี้มาบ้างแล้วและยังไม่พบโซลูชันที่ "สมบูรณ์แบบ" รูปแบบพื้นที่เก็บข้อมูลทำงานได้อย่างน่าอัศจรรย์สำหรับแอปพลิเคชัน MVC ที่บริบทสั้นเพราะมีอยู่ในตัวควบคุมช่วงสั้น ๆ แต่ปัญหาเกิดขึ้นเมื่อคุณพยายามที่จะใช้โครงสร้างเดียวกันกับแอพ wpf ที่ VM สามารถคงอยู่เป็นเวลานาน
ฉันเคยใช้วิธีแก้ปัญหานี้ในอดีตซึ่งง่ายกว่ารูปแบบ repo หลายอย่างที่ฉันเคยเห็นว่าความพยายามที่จะสรุปสิ่งต่าง ๆ ออกมาเป็นจำนวนที่มากที่สุดทำให้เกิดโค้ดที่อ่านไม่ได้ซึ่งยากต่อการแก้ไข นี่คือขั้นตอน ...
- สร้างโครงการแยกต่างหากสำหรับ EDMX เพื่อทำหน้าที่เป็นเลเยอร์การเข้าถึงข้อมูลของคุณ
- สร้างโฟลเดอร์ "Repositories" ภายใต้โครงการเดียวกัน
สร้างคลาสพื้นฐาน "BaseRepository" เพื่อทำหน้าที่เป็น "หน่วยงาน" IDisposable
จะอนุญาตให้คุณใช้สิ่งนี้ในusing(){}
และpartial
จะอนุญาตให้คุณใช้ที่เก็บอื่น ๆ
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
สร้างไฟล์อื่นที่ชื่อว่า "MyOtherRepository" สร้างคลาสบางส่วนที่เหมือนกัน แต่ใช้วิธีการตามสิ่งที่คุณต้องการให้ไฟล์นั้นมี
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
ใน VM ของคุณคุณสามารถทำได้ ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
กลุ่มนี้เป็นที่เก็บข้อมูลทั้งหมดของคุณภายใต้ชั้นเดียวดังนั้นคุณจึงไม่ต้องจัดการกับบริบทที่แยกต่างหาก ช่วยให้คุณจัดการ repos ที่แตกต่างกันได้ดีขึ้นโดยจัดกลุ่มวิธีเป็นไฟล์ต่าง ๆ และช่วยป้องกันการทำสำเนารหัส ยิ่งไปกว่านั้นบริบทของคุณสั้นเพียงเท่านี้โดยไม่ต้องใช้รูปแบบนี้
ข้อเสียคือด้วยระบบที่ใหญ่กว่าคุณอาจมีวิธีการมากมายที่รวมอยู่ใน repo ของคุณ ทางออกหนึ่งในกรณีนั้นคือการใช้คำสั่งพื้นฐานทั่วไปบางอย่างเช่น "ค้นหา" หรือ "เพิ่ม" และใช้คำสั่งพิเศษในพื้นที่เก็บข้อมูลที่เกี่ยวข้อง