我正在实现存储库模式。我的主要原因是:
通用存储库吗?
我遇到的问题是我是否应该拥有通用存储库。一种IQueryable<T> Query()
方法将为调用代码提供构造特定查询的方法。这里的问题是,这是泄漏的抽象-实体框架的详细信息现在正在泄漏到我的客户端代码中。
这将如何影响单元测试?我仍然可以ICustomerRepository
通过此实现来模拟吗?
这种效果将如何淹没我的持久层?像Azure存储表或NHibernate。
否则我将不得不实行非常具体的查询方法ICustomerRepository
,如GetIsActiveByFirstName()
和GetIsActiveByDistrict()
。我非常不喜欢这个,因为我的存储库类将被不同的查询方法挤满。该系统具有数百种模型,因此可能有数百种甚至数千种这样的方法来编写和维护。
IRepository<T>
坚持使用图案可以保持相对干净。
数据访问层
Respository<T> : IRepository<T>
核心
因此,现在Core中的代码可以引用了IRepository<t>
。实现类可以具有EF详细信息。但这不能从核心访问!
这样您就可以使用IQueryable。
public interface IRepositoryBase<TPoco>{
IQueryable<TPoco> GetListQ(Expression<Func<TPoco, bool>> predicate);
//...
如果您确定要添加则
//...
// logically exposing IQueryable<T> Include<T>(this IQueryable<T> source, string path) from EF
IQueryable<TPoco> IncludeNAVProp(string navToInclude);
}
然后执行存储库
return Context.Set<TPoco>().Include(navToInclude);
要求基础提供者为EF。因此,现在的模拟是针对实际的EF提供程序的。
除非您小心,否则为EF专用代码。泄漏出去。实际上,具有概念“包含”的接口IRepository已被视为泄漏。避免将EF详细信息保留在您的界面之外是避免泄漏的关键。
而且你可以有1IRepository<t>
个1Respository<t>
表和支持100S
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句