【发布时间】:2010-10-28 17:46:52
【问题描述】:
我正在使用 Entity Framework 4.0 编写一个 asp.net mvc 2 Web 应用程序。我有应该显示项目的视图、用于登录的视图等。我应该使用存储库模式来构建项目吗?如果是,如何?我应该为添加、更新、删除等基本方法和另一个使用存储库的常见方法(如登录验证等)的类创建一个接口吗?
【问题讨论】:
标签: asp.net-mvc-2 c#-4.0 entity-framework-4
我正在使用 Entity Framework 4.0 编写一个 asp.net mvc 2 Web 应用程序。我有应该显示项目的视图、用于登录的视图等。我应该使用存储库模式来构建项目吗?如果是,如何?我应该为添加、更新、删除等基本方法和另一个使用存储库的常见方法(如登录验证等)的类创建一个接口吗?
【问题讨论】:
标签: asp.net-mvc-2 c#-4.0 entity-framework-4
我将 EF 与存储库模式一起使用,它为我节省了大量工作!
小存储库模式介绍:
someRepository.Find.Where(something => something.IsRed && something.IsBig)
创建一个名为“IRepository”的通用接口,其类型包含所有数据访问方法。
它可能看起来像这样:
interface IRepository<T> where T : class
{
IEnumerable<T> FindAll(Func<T, bool> exp);
T FindSingle(Func<T, bool> exp);
}
创建一个实现此接口的抽象“存储库”类:
class Repository<T> : IRepository<T> where T : class
{
TestDataContext _dataContext = TestDataContext(); // Would be your EF Context
public IEnumerable<T> FindAll(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Where<T>(exp);
}
public T FindSingle(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Single(exp);
}
}
我们现在可以为实现我们的“IRepository”的something 表/对象创建一个接口,以及一个扩展抽象“Repository”类并实现“ISomethingInterface”的具体类:
interface ISomethingRepository : IRepository<Banner>
{
}
以及实现它的匹配存储库:
class SeomthingRepository : Repository<Banner>, IBannerRepository
{
}
我建议使用这种方法,因为它为您提供了很大的灵活性以及足够的能力来控制您拥有的所有微小实体。
这样调用这些方法会超级简单:
SomethingRepository _repo = new SomethingRepository ();
_repo.Find.Where(something => something.IsRed && something.IsBig)
是的,这意味着您必须做一些工作,但以后更改数据源会更容易。
希望对你有帮助!
【讨论】:
你能得到的最完整的答案可能在这里:
http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/
需要阅读和了解的内容很多,但如果您真的想了解如何将存储库模式与 EF 一起使用,那可能是最完整的来源。
可以在此处找到一些用于快速入门的更简单示例代码:
http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository
您还可以找到不同的变体 + 讨论(例如,从存储库返回 IQueryable's 是否是个好主意等。
【讨论】:
ContextBuilder)。如果您只想重复使用打包的源代码(来自下载),您当然可以安装 CTP。