定義存儲庫有兩種方法。首先是通過暴露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