Đã đọc qua một số bài viết về những lợi ích của việc tạo Kho lưu trữ chung cho một ứng dụng mới ( ví dụ ). Ý tưởng có vẻ hay vì nó cho phép tôi sử dụng cùng một kho lưu trữ để thực hiện một số việc cho một số loại thực thể khác nhau cùng một lúc:
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();
Tuy nhiên, phần còn lại của việc triển khai Kho lưu trữ có sự phụ thuộc lớn vào 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
Mẫu kho lưu trữ này hoạt động tuyệt vời cho Entity Framework và khá nhiều cung cấp ánh xạ 1 đến 1 của các phương thức có sẵn trên DbContext / DbSet. Nhưng với sự hấp thụ chậm của Linq trên các công nghệ truy cập dữ liệu khác ngoài Entity Framework, điều này mang lại lợi thế gì cho việc làm việc trực tiếp với DbContext?
Tôi đã cố gắng viết phiên bản PetaPoco của Kho lưu trữ, nhưng PetaPoco không hỗ trợ Linq Expressions, việc tạo giao diện IRep repository chung khá vô dụng trừ khi bạn chỉ sử dụng nó cho GetAll, GetById, Thêm, Cập nhật, Xóa và Lưu phương thức và sử dụng nó như là một lớp cơ sở. Sau đó, bạn phải tạo các kho lưu trữ cụ thể với các phương thức chuyên dụng để xử lý tất cả các mệnh đề "ở đâu" mà trước đây tôi có thể chuyển qua làm vị ngữ.
Mẫu Kho lưu trữ chung có hữu ích cho mọi thứ bên ngoài Entity Framework không? Nếu không, tại sao ai đó sẽ sử dụng nó thay vì làm việc trực tiếp với Entity Framework?
Liên kết gốc không phản ánh mẫu tôi đang sử dụng trong mã mẫu của mình. Đây là một ( liên kết cập nhật ).