我的回答是基于你直接使用实体框架中的UI /控制器/服务假设你的问题。
已经证明在您的UI /控制器/服务中直接使用包含EF的任何ORM将在未来导致很多问题。最重要的是,它使得如果单元测试你的应用程序非常困难,甚至不可能。
第二种方法,即“Model implements repository”在我看来也是错误的,因为Model和Respositories有不同的责任,并且基于SOLID原则的“Single Responsibilty”部分,您不应该将两个概念合并在一起。即使您想在您的模型中使用Active Objects模式(我不建议使用),您也必须从您使用的ORM中分离模型。
最好和最值得推荐的解决方案是作为图案表明有像IRepository或IRepository接口与非常基本的成员。类似于:
Interface IRepository<T> where T:class
{
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
// if you don't want to return IQueryable
T FindById(object id);
IEnumerable FindXXXXX(params)
// if you prefer to return an IQueryable
IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}
请注意,一些相关的信息库不应返回IQueryable。此外,您可以考虑使用ISpecification而不是表达式和lambda。
你需要实现IRepositoy界面,大部分的实体。使用这种方法,你也可以在编写单元测试时模拟你的仓库。在生产中,您将需要使用国际奥委会提供商,如团结,Ninject,李林甫,Catsle等。您还可以从Microsoft的通用服务定位器实现中受益,以避免耦合到特定的IoC框架。
在过去,我曾经有一个数据访问接口,它被实现为特定的业务领域或服务。这种方法的一个问题是,如果你跟踪你的源代码,你最终会得到不同数据访问服务中的重复代码。
我会建议改变问题的标题,因为它有点混乱。标题是关于如何使用实体框架和关于替代品的全部讨论(即如何不使用它) – 2009-08-05 16:57:46