下面是一個使用EF框架演練一個小程序存儲庫模式:
someRepository.Find.Where(something => something.IsRed && something.IsBig)
創建一個名爲包含所有的數據訪問方法類型T
的「IRepository」通用接口。
它看起來是這樣的:
interface IRepository<T> where T : class
{
IEnumerable<T> FindAll(Expression<Func<T, bool>> exp);
T FindSingle(Expression<Func<T, bool>> exp);
// And many more!
}
創建一個抽象的「倉庫」類實現了這個接口:
class Repository<T> : IRepository<T> where T : class
{
TestDataContext _dataContext = TestDataContext(); // Would be your EF Context
public IEnumerable<T> FindAll(Expression<Func<T, bool>> exp)
{
_dataContext.GetTable<T>().Where<T>(exp);
}
public T FindSingle(Expression<Func<T, bool>> exp)
{
_dataContext.GetTable<T>().Single(exp);
}
// And many more!
}
我們現在可以爲ModelClass
表創建一個接口/對象,它實現我們的'IRepository'和擴展抽象'Repository'類並實現'IModelClassInterface'的具體類:
interface IModelClassRepository : IRepository<ModelClass>
{
}
和匹配的存儲庫來實現它:
class ModelClassRepository : Repository<ModelClass>, IModelClassRepository
{
}
我建議,因爲它爲您提供了很大的靈活性,以及足夠的力量來控制所有你的小實體使用這種方法。
調用這些方法將是超級簡單的這樣:
ModelClassRepository _repo = new ModelClassRepository();
_repo.Find.Where(something => something.IsRed && something.IsBig)
是的,這意味着你必須做一些工作,但它是地獄更容易爲你以後更改數據源。
你甚至可以用任何你選擇的數據提供者來切換EF框架。無論是XML,db4o還是普通的舊Txt。
存儲庫在我看來,除了一個好的數據庫抽象工具外,還應該使用模式。 – 2010-12-04 01:06:03
是的,使用存儲庫模式來保持你的代碼不依賴於任何特定的數據庫,然後使用像Entity Framework這樣的體面的orm來保存處理sql和更改跟蹤的頭痛。 – rtpHarry 2010-12-04 01:20:59