【问题标题】:Specific queries in Repository存储库中的特定查询
【发布时间】:2011-10-17 21:59:16
【问题描述】:
我一直在阅读有关存储库模式(Linq2SQL 或 EF)的大量资料。我见过一些带有一些特定查询的存储库,例如FindUserByName,我会将 where 表达式传递给存储库。
另一方面,我看到一些只有“保存、更新和 GetAll”的存储库,GetAll 返回一个 IQueryable。而且,这个 IQueryable 在服务层被过滤掉了。
那么,在您看来,将特定查询传递给存储库是好的还是尽可能简单地让所有过滤器都在服务中发生?
谢谢!
【问题讨论】:
标签:
linq-to-sql
entity-framework-4
c#-3.0
repository-pattern
【解决方案1】:
我的建议是创建一个GenericRepository<T>,它具有核心的基本方法(Find、Save、Delete 等)。
示例:
public abstract class GenericRepository<T> : IRepository<T> where T : class
{
public T FindSingle(Expression<Func<T,bool>> predicate) { .. };
public IQueryable<T> Find() { .. };
public void Delete(T entity) { .. };
}
然后创建从通用存储库继承的特定存储库,以创建专用方法。
示例:
public class EmployeeRepository : GenericRepository<Employee>, IRepository<Employee>
{
public Employee FindByLastName(string lastName)
{
return FindSingle(emp => emp.LastName == lastName);
}
public ICollection<Employee> FindAllManagers()
{
return Find().Where(emp => emp.Type == "Manager").ToList();
}
// other methods...
}
这意味着您不会跨存储库复制通用代码。
是的,另一种选择是使用GenericRepository<T> 以外的服务。这意味着服务(本质上)是一个专门的存储库。
因此,如果您想要一个服务层或专门的存储库,这只是一个偏好问题。