【问题标题】:Shall, I implement Repository, Unit of Work for EF6?我应该为 EF6 实施存储库、工作单元吗?
【发布时间】:2014-02-12 08:32:32
【问题描述】:

自从 MSDN 提到 DbContext:

DbContext 实例表示工作单元和 存储库模式,使其可用于从数据库中查询 并将更改组合在一起,然后将其写回存储 作为一个单位。 DbContext 在概念上类似于 ObjectContext。

在使用EF5+的时候实现这两个(Unit of Work & Repository)是不是多余?

有人可以更深入地了解这个主题吗?

我打算使用 SQL Server 构建一个基于 MVC 的应用程序,并且在阅读了很多关于具有单元可测试性的数据访问技术之后,我对上面的信息有点迷失了!

【问题讨论】:

    标签: c# asp.net-mvc entity-framework unit-testing


    【解决方案1】:

    这取决于您的项目的复杂性及其要求。例如,这两个问题可能会帮助您做出决策:

    1. 您是否会使用除 EF 之外的任何其他必须使用它的数据源?
    2. 您将来将 EF 换成不同的 ORM 或数据源的可能性有多大?

    如果您无法预见变化,或者您不需要只使用 EF,那么这可能不值得麻烦。

    【讨论】:

    • 使用通用存储库的麻烦真的很小。
    • @jnovo:对于这两个问题,我的回答都是“否”。我最关心的是整个应用程序的(简单)测试能力!
    • @SamLeach 好吧,我认为这取决于项目。太多次人们开始为非常小的东西使用大量的样板。可以说,如果您不打算注入依赖项等,则使用通用存储库没有什么意义。此外,还有一些缺点必须权衡,例如不直接使用它会丢失 EF 功能。
    • @jnovo,+1 如果您不公开它们,您可能会失去功能。
    【解决方案2】:

    我将创建一个通用存储库,以便您可以在测试中模拟它,而不是直接模拟实体框架的上下文。但是,是的,EF 5+ 确实按照 MSDN 的规定实现了这些模式。

    这是一个抽象层。存储库模式是对象的集合和获取对象集合的事物。实体框架知道如何获取对象集合,存储库不知道如何。

    Entity Framework 有很多特性,你可能会因为将其包装在存储库或更精简的服务中而失去这些特性。如果您针对自己的类练习 TDD 编码,通常比模拟第三方代码更舒服。

    Ayende has a blog post about this.

    【讨论】:

    • Ayende 的博客引发了这个问题,但我实际上想确保,是否有人通过单元测试测试了水域(使用原始 EF,没有包装器)?
    • @Nauman 我不会,因为通常测试第三方库很痛苦。 EF 可能并不痛苦,但我通常会远离它,你可以接受围绕它的瘦服务而不是存储库。
    • 您有通用存储库实现的工作示例吗?或者你能给我指出一个可以提供的资源吗?
    • 周围有很多例子。 codeproject.com/Tips/572761/… 并搜索 /search?q=ef+generic+repository
    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2012-02-02
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多