Tôi đã xem xét điều này khá nhiều và chưa tìm thấy giải pháp "hoàn hảo". Mẫu kho lưu trữ hoạt động tuyệt vời cho các ứng dụng MVC trong đó bối cảnh tồn tại trong một thời gian ngắn vì nó tồn tại trong một bộ điều khiển tồn tại ngắn, nhưng vấn đề xảy ra khi bạn cố gắng áp dụng cấu trúc tương tự cho ứng dụng wpf trong đó VM có thể tồn tại trong thời gian dài.
Tôi đã sử dụng giải pháp này trong quá khứ đơn giản hơn nhiều mẫu repo mà tôi đã thấy rằng cố gắng trừu tượng hóa mọi thứ đến mức cực đoan, dẫn đến số lượng mã khó đọc gần như khó đọc. Dưới đây là các bước ...
- Tạo một dự án riêng để EDMX hoạt động như lớp truy cập Dữ liệu của bạn
- Tạo thư mục "Kho lưu trữ" trong cùng một dự án
Tạo một lớp cơ sở "BaseRep repository" để hoạt động như "Đơn vị công việc". IDisposable
sẽ cho phép bạn sử dụng điều này trong một using(){}
và partial
sẽ cho phép bạn thực hiện các kho khác
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Tạo một tệp khác gọi là "MyOtherRep repository". tạo cùng một lớp một phần nhưng thực hiện các phương thức dựa trên những gì bạn muốn tệp đó chứa
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Bây giờ trong VM của bạn, bạn có thể làm điều này ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Nhóm này tất cả các kho lưu trữ của bạn dưới một lớp để bạn không phải đối phó với bối cảnh riêng biệt. Nó cho phép bạn quản lý tốt hơn các repos khác nhau bằng cách nhóm các phương thức vào các tệp khác nhau và giúp ngăn ngừa sao chép mã. Trên hết, bối cảnh của bạn chỉ tồn tại trong thời gian ngắn mà không sử dụng mô hình này.
Nhược điểm là với các hệ thống lớn hơn, bạn có thể có rất nhiều phương thức được gói trong repo của bạn. Một giải pháp trong trường hợp đó là triển khai một số lệnh phổ biến cơ bản như "Tìm" hoặc "Thêm" và triển khai các lệnh chuyên biệt trong kho lưu trữ tương ứng của chúng.