有几篇很好的博客介绍如何使用通用类一起实现仓储模式和工作单元模式。
这个想法是定义一个通用接口IRepository和一个隐藏了数据实际访问方式的类Repository。它可以使用Entity Framework DbContext进行访问,或者可能是一个内存集合用于单元测试。
public interface public interface IRepository<T> where T : class
{
T GetById(int Id);
void DeleteById(int Id);
void Add(T entity);
void Update(T entity);
etc.
}
我经常看到添加了几个类似于Queryable和/或Enumerable函数的查询功能。
例如,在实现数据访问层中,我看到:
/// Returns an IEnumerable based on the query, order clause and the properties included
/// <param name="query">Link query for filtering.</param>
/// <param name="orderBy">Link query for sorting.</param>
/// <param name="includeProperties">Navigation properties seperated by comma for eager loading.</param>
/// <returns>IEnumerable containing the resulting entity set.</returns>
IEnumerable<T> GetByQuery(Expression<Func<T, bool>> query = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "");
/// <summary>
/// Returns the first matching entity based on the query.
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
T GetFirst(Expression<Func<T, bool>> predicate);
如果接口有一个函数IQueryable GetQuery(),那么我就不需要像GetFirst()和GetByQuery()这样的函数了。
问题:为什么不推荐这样做?人们能以不良的方式更改数据吗?