我曾經使用NHibernate的存儲庫接口。存儲庫模式與實體框架4
在EF中使用此模式的正確方法是什麼?
如何才能實現這個存儲庫接口,爲RepositoryBase<T>
?
public interface IRepository<T>
{
T GetById(object id);
void Save(T entity);
T[] GetAll();
void Delete(T entity);
}
我曾經使用NHibernate的存儲庫接口。存儲庫模式與實體框架4
在EF中使用此模式的正確方法是什麼?
如何才能實現這個存儲庫接口,爲RepositoryBase<T>
?
public interface IRepository<T>
{
T GetById(object id);
void Save(T entity);
T[] GetAll();
void Delete(T entity);
}
這不是一個真正的很多不同於任何其他ORM。這裏有一個例子:http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/20/using-repository-pattern-with-entity-framework.aspx
有幾種方法(大多數都很相似,只是略有不同),所以我建議你做一些研究並選擇最適合你的方法。
使用EF 4可以通過使用ObjectSet<T>
來實現通用存儲庫。看看幾篇文章,這可能有助於:
http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository
你基本上你的資料庫說話喲你的對象範圍內。只有改變我會做將讓您的GETALL返回一個IEnumerable,而不是像這樣:
public class SomeObjectRepo : IRepository<SomeObject>
{
SomeContext GetById(object id)
{
using(var context = new MyContext())
{
return context.SomeObjects.First(x=>x.id.Equals(id));
}
}
etc...
}
這是我的解決方案:http://www.necronet.org/archive/2010/04/10/generic-repository-for-entity-framework.aspx
我喜歡這個,因爲它確實庫不夫婦實例與具體實例對象上下文,所以在一些DI框架中,我可以將所有存儲庫都設置爲單例。
由於某些原因,所有示例都將集合公開爲IQueryable或IEnumerable。 EF4有一個用於此目的的接口 - IObjectSet(如果您使用最新的CTP,則爲IDbSet)。
朱莉·勒曼有這樣做,包括創建一個MockSet實現IObjectSet一個巨大的崗位,這樣你就可以做一些斷開的單元測試
看起來像IObjectSet是EF特定的,因此我不喜歡存儲庫模式。要點是你不希望你的Irepository具有EF依賴 – Gluip 2011-07-24 11:00:03