使用EntityFramework的模式?

6
什么是 Entity Framework 的替代模式?
我知道的一些替代模式有:
1. “纯粹”的 EntityFramework - 也称为 Unit of Work
``` using (Data.Model c = new Data.Model()) { var z = c.Users.Where(x=>x.Name=='John'); } ```
2. 仓储模式
``` // Model 实现了 IRepository 接口 User user = Model.Instance.Get(u => u.Name == "John"); ```
3. 还有其他的吗?
4. ?

我建议更改问题的标题,因为它有点令人困惑。标题是关于如何使用Entity Framework,而整个讨论是关于替代方案(即如何不使用它)。 - Bogdan_Ch
我正在尝试找到如何准确使用EF的方法。 我的意思是,我不需要EF的替代方案,我只需要使用基于EF的不同模式的可能性。 - bug0r
5个回答

2
一本不错的书是Martin Fowler的《企业应用架构模式》。在那里,他介绍了一些检索/映射数据的模式,例如DTO、工作单元、存储库模式等等...也许有些东西与Entity Framework结合起来会很有用。我得看看它。

1

我根据您直接在UI/控制器/服务中使用Entity Framework的假设来回答您的问题。

已经证明,直接在UI/控制器/服务中使用任何ORM(包括EF)将会在未来引起很多问题。此外,它使得应用程序难以进行单元测试,甚至不可能。

我认为第二种方法即“模型实现存储库”也是错误的,因为模型和存储库有不同的职责,根据SOLID原则中的“单一职责”,您不应该将这两个概念合并在一起。即使您想在模型中使用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);
}

请注意,有些人认为Repositories不应该返回IQueryable。此外,您可以考虑使用ISpecification而不是表达式和lambda。
对于大多数实体,您需要实现IRepository接口。使用这种方法,您还可以在编写单元测试时模拟您的存储库。在生产中,您需要使用像Unity、Ninject、Linfu、Catsle等Ioc提供程序。您还可以从Microsoft的常见服务定位器实现中受益,以避免与特定的IoC框架耦合。
在过去,我曾经有一个数据访问接口,它是针对特定业务领域或服务实现的。这种方法的问题之一是,如果您跟踪源代码,您将最终在不同的数据访问服务中得到重复的代码。

0

我们使用类似于您工作单元示例中的代码。

另外,我们将对象映射到数据传输对象。


0

关于这个主题有很多文章,但如果你想要一篇好的文章,那么列表会大大缩减。MSDN Magazine上的这篇文章非常不错,虽然它专门讨论了n层应用程序。但既然你没有说你正在构建什么,也许它会有所帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接