2009-08-04 54 views
6

什么是使用实体框架的替代模式?使用EntityFramework的模式?

一些我知道的是:

  1. “平原” 的EntityFramework - 工作

     
    using (Data.Model c = new Data.Model()) 
    { 
        var z = c.Users.Where(x=>x.Name=='John'); 
    }

  2. 又名团结库模式

     
    //Model implements IRepository 
    User user = Model.Instance.Get<User>(u => u.Name == "John"); 
    

  3. 什么?
+0

我会建议改变问题的标题,因为它有点混乱。标题是关于如何使用实体框架和关于替代品的全部讨论(即如何不使用它) – 2009-08-05 16:57:46

回答

2

一本好书是Martin Fowler的"Patterns of enterprise application architecture"

在那里,他经历了一些检索/映射DTO,工作单元,存储库模式等数据的模式......可能有些东西可能与实体框架一起使用。我不得不看看它。

0

我们使用的代码与您在工作单元中的示例相似。

我们另外做的是将对象映射到数据传输对象。

0

关于这个问题有很多文章,但是如果你想要一个好的文章,名单会大大减少。 This article from MSDN Magazine是非常好的,虽然它专门处理n层应用程序。但既然你没有说你在建什么,也许会有所帮助。

1

我的回答是基于你直接使用实体框架中的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框架。

在过去,我曾经有一个数据访问接口,它被实现为特定的业务领域或服务。这种方法的一个问题是,如果你跟踪你的源代码,你最终会得到不同数据访问服务中的重复代码。