【问题标题】:Should I be injecting my context into my repository classes?我应该将我的上下文注入我的存储库类吗?
【发布时间】:2012-08-30 20:57:51
【问题描述】:

我有许多如下所示的存储库类:

public class ProfileRepository : IProfileRepository{
     private MyEntities myEnt = new MyEntites();
     ...
}

MyEntities 类是我使用实体框架在我的 .edmx 文件中生成的实体。我经常在我的所有存储库类中使用这个对象,并且我所有的存储库类都被注入到我的控制器中。有没有一种方法/将myEnt 对象注入到我的存储库类中是一种好习惯,它是否也能以同样的方式与并发一起工作?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 entity-framework ninject.web.mvc


    【解决方案1】:

    MyEntities 是您的上下文,我假设。如果是这样,那么是的,这是将上下文注入存储库的好习惯。这样,您可以模拟您的存储库,然后您的单元测试可以测试功能,而不必担心数据库(或其他持久性存储)的连接性。

    【讨论】:

    • 答案是“是”,您应该注入上下文但参数不同。您注入上下文以便能够更精确地控制其生命周期。例如,您可以有一个容器控制的生命周期(单例)或一个持续请求处理生命周期的上下文。至于模拟,您可以通过提供存储库接口的另一个实现(甚至使用模拟库)来模拟您的存储库;注入上下文与模拟无关。
    • 理论上,这是个好主意,因为您可能有一天需要更改数据存储。在实践中,这几乎不会发生,并且模拟数据存储会产生测试,其唯一目的是检查存储库的 API,如果您的存储库只是 DAL 上的薄薄的一层,那么这个练习就没有特别意义了。
    • @罗伯特:是的。虽然这对于模拟存储库很常见,但我几乎无法想象模拟数据存储只是为了测试存储库本身。存储库的实现与底层数据存储之间的依赖关系是稳定的。易变的是存储库与其客户端之间的依赖关系。
    【解决方案2】:

    答案是“是”。

    基本原理如下:通过在存储库中创建上下文实例,您不允许调用者控制上下文的生命周期。

    例如,在基于 Web 的场景中,您不希望每次创建存储库类的实例时都重新创建上下文。相反,您希望上下文在服务器上持续处理请求时一直存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多