定义存储库有两种方法。首先是通过暴露IQueryable的是够做任何事:
public interface IRepository<T> where T: class
{
IQueryable<T> GetQuery();
// This method requires additional knowledge about entity
// or more compilcated approach. The point of the method
// is to check EF's internal storage first before querying DB
// T GetById(int Id);
void Delete(T entity);
void Add(T entity);
void Attach(T entity);
}
拥有一个像GetAll
或First
东西简直是多余的,因为GetQuery
服务器这一切。第二种方法是特定的储存库,你不要暴露IQueryable
:
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll();
// Expressions!!!! Func will load all items to memeory
// and then perform filtering by linq-to-objects!!!!!!
IEnumerable<T> Find(Expression<Func<T, bool>> where);
T Single(Expression<Func<T, bool>> where);
T First(Expression<Func<T, bool>> where);
void Delete(T entity);
void Add(T entity);
void Attach(T entity);
}
第二个版本,然后通过添加方法,如GetXXXOrderedByName,GetXXXWithRelatedYYY等具体信息库接口派生
还有一点就是SaveChanges
通常不是存储库的一部分,因为您可能需要修改多个存储库中的项目,并通过单一方法将更改保存在所有存储库中。为此目的存在另一种模式 - 工作单元。
'的SingleOrDefault()'是'IEnumerable的' –
2011-04-25 00:11:22
@Bala为r的扩展方法:我知道,我很期待为了完成所有IObjectSet的接口和实现,我可以公开所有的方法。 – Naor 2011-04-25 00:19:00