下面是一个使用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