正在阅读一些有关为新应用创建通用存储库的优势的文章(示例)。这个主意看起来不错,因为它让我可以使用同一个存储库同时为几种不同的实体类型做几件事:
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效果非常好,并且几乎提供了DbContext / DbSet上可用方法的一对一映射。但是,鉴于LINQ在Entity Framework之外的其他数据访问技术上使用缓慢,与直接使用DbContext相比,这提供了什么优势?
我尝试编写存储库的PetaPoco版本,但PetaPoco不支持Linq表达式,这使得创建通用IRepository接口几乎没有用,除非您仅将其用于基本的GetAll,GetById,Add,Update,Delete和Save。方法并将其用作基类。然后,您必须使用专门的方法创建特定的存储库,以处理我以前可能作为谓词传入的所有“ where”子句。
通用存储库模式对实体框架以外的其他内容有用吗?如果不是,为什么有人要使用它而不直接使用Entity Framework?
原始链接无法反映我在示例代码中使用的模式。这是(更新的链接)。