【问题标题】:Static field of DbContext in Global.asax versus instance field of DbContext in controller class?Global.asax 中 DbContext 的静态字段与控制器类中 DbContext 的实例字段?
【发布时间】:2011-01-31 05:25:15
【问题描述】:

坦率地说,我是 C# 和 Asp.net MVC 的新手。 我也不知道 asp.net web 应用程序在幕后的 IIS 和 ASP.NET 框架上是如何工作的。

我对必须在我的 asp.net mvc 应用程序中声明 DbContext 字段(或从 DbContext 派生的任何类)的决定感到困惑。

我有两个选择:

  1. 将该字段声明为global.asax 内的静态字段,以便所有控制器都可以使用它。
  2. 将该字段声明为每个控制器类中的实例字段。

你能解释一下哪一个是正确的吗?确实需要更详细的解释。

【问题讨论】:

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


    【解决方案1】:

    如果在 global.asax 中将其设为静态字段,则会遇到并发问题。来自多个请求的多个线程可以进来并获取彼此的数据。更糟糕的是,在您开始在您的网站上获得更多流量或开始负载测试之前,这不会出现。你将把它实现为一个单例,在你的测试中一切都会很好,你会想,“我是个天才!看看这个实现有多干净!”但总有一天,你会像我一样被这件事烧死。结果会混淆,用户将开始看到不属于他们的数据,并且网站会出现意外行为。

    Entity Framework 和 LINQ to SQL 的上下文类被设计为轻量级实例化,您可以为要运行的每组查询进行设置。它并不意味着长寿。

    Check out this other Stack Overflow question / answer on the same topic, worded differently.

    【讨论】:

      【解决方案2】:

      您应该选择第二个选项。即在控制器中声明并使用它。如果你把 DBContext 作为一个静态字段放在 global.asax 中,你基本上就是把它变成了整个应用程序的单个实例。

      另一方面,使用第二个选项,每个请求都有一个 DBcontext。如果可以使用依赖注入来获取每个操作方法中的 DBContext,那就更好了。

      【讨论】:

      • 如果我在整个应用程序中使用单个 DbContext 实例(或从 DbContext 派生的类)会有什么缺点?
      • @Stack Overflow - 阅读关于数据库连接的“单例”,以及它为什么是邪恶的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多